public class TestInitialization {
private User userA;
}
編譯後,使用javap查看字節碼,紅色部分為編譯器自動賦初值的過程:
如果是方法中的局部變量,編譯器不會自動賦初值。 User user;只是定义的变量user,但并未给user在内存中分配空间,没有初始化,无法通过编译;User user = null;只是定義的變數user,但並未給user在記憶體中分配空間,沒有初始化,無法通過編譯;User user = null;不僅定義了變數user,也為user分配了記憶體空間,user現在指向null。
這需要看
User user;
出現在哪裡,先放結論:如果是物件的屬性(field),則兩種寫法沒有區別。
如果是方法中的局部變量,若方法中沒有其他地方對user賦值,則編譯錯誤。
如果是物件的屬性,那麼在編譯的時候,java編譯器會自動為field賦初值(原始型別為預設值;參考型別為null)。例如下面的程式碼:
編譯後,使用javap查看字節碼,紅色部分為編譯器自動賦初值的過程:
如果是方法中的局部變量,編譯器不會自動賦初值。
User user;
只是定义的变量user,但并未给user在内存中分配空间,没有初始化,无法通过编译;User user = null;
只是定義的變數user,但並未給user在記憶體中分配空間,沒有初始化,無法通過編譯;User user = null;
不僅定義了變數user,也為user分配了記憶體空間,user現在指向null。如果user是局部變數: 在第一次賦值 (包括初始化為null) 之前使用user是編譯錯誤
賦值後沒區別
好像是一樣的
沒有差別 , 預設的初始化值為null
沒有= 在棧裡面沒有開空間給他。 加上=null 就在堆疊裡面給他指定了一個空的佔位符