Java類中字段可以不賦予初始值的原因分析
Java類中字段可以不賦予初始值的原因
Java虛擬機會對類的實例對象進行分配內存,在分配內存后,會將內存空間(除了對象頭)全部初始化為零值。這就保證了,在類的定義過程中,不給字段賦初始值,實例對象也能有初始值。
下面是在Java類中各字段的初始值
| 字段 | 默認初始值 |
| 對象 | null |
| 數值(byte,short,int,long,float,double) | 0或0.0 |
| boolean | false |
| char | \u0000(輸出出來是空值) |
class Solution {
private static char c;
private static int i;
private static long l;
private static float f;
private static double d;
private static String s;
private static boolean bl;
private static byte b;
public static void main(String[] args) {
System.out.println(c == '\u0000');
System.out.print(c);
System.out.println(i);
System.out.println(l);
System.out.println(f);
System.out.println(d);
System.out.println(s);
System.out.println(bl);
System.out.println(b);
}
}
/*輸出結果
true
0
0
0
0
0.0
0.0
null
false
*/
Java中類屬性的初始化
我們知道一個類(class)要被使用必須經過裝載,連接初始化這樣的過程。下面先對這三階段做一個簡單的描述,之后會結合一個簡單的例子來說明java中類的初始化過程。
在裝載階段,類裝載器(Bootstrap ClassLoader 或者用戶自定義的ClassLoader) 把編譯形成的class文件載入內存,創(chuàng)建類相關的Class對象,這個Class對象封裝了我們要使用的類的類型信息。
連接階段又可以分為三個子步驟:驗證、準備和解析
驗證就是要確保java類型數據格式 的正確性,并適于JVM使用。
準備階段,JVM為靜態(tài)變量分配內存空間,并設置默認值,注意,這里是設置默認值,比如說int型的變量會被賦予默認值0 。在這個階段,JVM可能還會為一些數據結構分配內存,目的 是提高運行程序的性能,比如說方法表。
解析過程就是在類型的常量池中尋找類、接口、字段和方法的符號引用,把這些符號引用替換成直接引用。這個階段可以被推遲到初始化之后,當程序運行的過程中真正使用某個符號引用的時候 再去解析它。
類會在首次被“主動使用”時執(zhí)行初始化,為類(靜態(tài))變量賦予正確的初始值。在Java代碼中,一個正確的初始值是通過類變量初始化語句或者靜態(tài)初始化塊給出的。
而我們這里所說的主動使用 包括
1. 創(chuàng)建類的實例
2. 調用類的靜態(tài)方法
3. 使用類的非常量靜態(tài)字段
4. 調用Java API中的某些反射方法
5. 初始化某個類的子類
6. 含有main()方法的類啟動時
初始化一個類包括兩個步驟
1、 如果類存在直接父類的話,且直接父類還沒有被初始化,則先初始化其直接父類
2、 如果類存在一個初始化方法,就執(zhí)行此方法
注:初始化接口并不需要初始化它的父接口。
Java中final變量為什么在使用前必須要進行初始化
final修飾的變量表示賦值之后不能再進行更改,系統(tǒng)賦默認值也算賦值,因此系統(tǒng)也不會賦默認值。
如果不在定義的時候或者構造函數中對final變量進行賦值的話,則生成的對象中final變量的值是未知的(編譯器也會直接報錯),因此必須進行初始化。
如果用static final同時修飾變量的話,則變量必須在定義的時候進行初始化。因為static變量屬于類,在調用構造函數之前就已經被系統(tǒng)賦予默認值了。
如果不在定義的時候初始化,那么既無法在構造函數中初始化,系統(tǒng)也不會賦默認值。則該變量被定義出來是毫無意義的
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java零基礎也看得懂的單例模式與final及抽象類和接口詳解
本文主要講了單例模式中的餓漢式和懶漢式的區(qū)別,final的使用,抽象類的介紹以及接口的具體內容,感興趣的朋友來看看吧2022-05-05
JAVA 16位ID生成工具類含16位不重復的隨機數數字+大小寫
這篇文章主要介紹了JAVA 16位ID生成工具類含16位不重復的隨機數數字+大小寫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
Springboot允許logger.debug輸出日志方式
這篇文章主要介紹了Springboot允許logger.debug輸出日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Java8?CompletableFuture?runAsync學習總結submit()?execute()等
這篇文章主要介紹了Java8?CompletableFuture?runAsync學習總結submit()?execute()等,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10

