Java對象及對象引用
首先定義一個簡單的類:
class User{
int userId;
String userName;
}
我們在創建對象時,通常會寫:
User user = new User();
這個操作包含了四個動作。
1)右邊的"new User",是以User為模板,在堆(heap)中創建一個User類對象(也可以說User對象)。
2)末尾的()意味着,對象創建后,立刻調用User類的構造函數,對剛生成的對象進行初始化。構造函數肯定是有的,如果你沒有寫,Java會給你補上默認的構造函數。
3)左邊"User user"創建了一個User類引用變量。User類引用就是以后可以用來指向User對象的對象引用。
3)"="操作符使對象引用指向剛創建的那個User對象。
為了更好的理解,拆分成兩步:
User user;
user = new User();
功能效果是一樣的,這樣就比較清楚了,有兩個實體:一個是對象引用變量,一個是對象本身。
一般引用是存放在棧(stack),對象存放在堆(heap)。
我們創建對象,為什么還要創建對象引用變量?
因為創建的User對象是沒有名字的,可以認為是User類名稱(對象的創建模板)
所以一個User類可以據此創建無數個對象,且這些對象不能全叫"User"。
我們不能直接訪問,只能通過對象引用來間接訪問對象。
理解到這里,拓展下這里的知識:
For Example:
User user_1 = new User();
User user_2;
user_2 = user_1;
這里解釋下,user_2沒有指向對象,但是發生了復制行為,要說的是,對象沒有被復制,被復制的只是對象引用。結果是,user_2也指向了user_1所指向的對象。
以此類推:
user_2 = new User();
則表示user_2引用變量修改指向第二個User對象。
得出結論:
1)一個對象引用可以指向一個或多個對象
2)一個對象可以有N個引用指向它
再拓展下:
user_1 = user_2;
現在user_1也指向了第二個User對象,那么第一個User對象吶?因為沒有被使用到,就會被Java垃圾回收處理機制回收了,至於什么時候回收,要看垃圾回收機制的策略或者心情了,就是等待JVM回收。
以此類推,一些沒有引用指向的對象,都會被丟棄,等待JVM回收
For Example:
new User();
System.out.println("Hello World!");