Java中this的問題

時間 2021-06-01 04:13:50

1樓:閣剛廣志

乙個解釋,細節不一定完全正確,但是可以解釋題主的問題

主要是看到眾多答主要麼過於簡略;要麼答非所問;要麼不能自圓其說

所以這裡我盡量說得形象清楚一些:

首先main函式中的這句【Father obj = new Son(); 】

先new了乙個Son物件。初始化過程是這樣的:

因為Son的基類是Father,所以先進入Father類進行初始化

類初始化的過程我們知道是:1)static成員初始化;2)成員初始化;3)執行構造方法

於是先對成員進行初始化,【public String name = "父類字段"; 】於是:son物件.super.

name =「父類字段」(這裡存疑,表達不太嚴謹,只是可以這麼理解)

於是執行構造方法:

【System.out.println(this); 】列印this,this是什麼呢,【this只能在方法內部使用,表示呼叫方法的那個物件的引用】,所以呼叫這個構造方法的物件是什麼,現在就只有乙個物件,也就是son物件,這個son物件是在呼叫基類的構造方法,所以列印出來自然是【Son@1484a05 】

【System.out.println(this.name); 】列印this.name,this是son物件,son物件.name其實現在是null,但是

【this.name】會在編譯期被解析,直接在編譯期被優化成基類的這個name,前期就繫結了。為什麼這麼做的原因就是域成員的天然性質 。

所以在這句的時候,直接就呼叫父類的「父類字段」來輸出。

父類初始化結束,開始初始化子類,子類只有乙個成員需要初始化,於是終於有了【son物件.name =「子類字段「 】

(全部初始化結束)

新建了乙個Fathe型別的空引用obj=null

把Son型別的物件自動轉型成Father型別

把這個物件的引用賦給obj

然後是main函式中的下一句【System.out.println(obj.

name); 】,我們知道obj是乙個Father型別的物件,於是呼叫Father物件的name,同時因為變數成員不存在覆蓋的問題,於是直接是等於「父類字段」。

Java中關於String的問題?

超級大地 Q1jvm執行記憶體分為五個部分,那字串常量池屬於哪個部分的?是屬於堆的一部分還是單獨的一部分記憶體區域?字串常量池屬於方法區,準確的來說是方法區中的執行時常量池。方法區邏輯上是堆記憶體的一部分,例如我們常用的HotSpot虛擬機器就是將方法區劃為堆記憶體中的永久代,但是為了區分,主流還是...

Java中volatile的幾個問題?

動力節點線上 1 volatile變數能不能保證原子性?大部分情況不能依靠volatile來保證原子性,它不應該用於保證原子性 2 可不可能幾個執行緒同時寫volatile變數,多核cpu如何處理同時訪問同乙個記憶體塊,volatile會直接訪問記憶體,而不經過快取?多個執行緒可以同時寫,volat...

java中懶漢式的volatile的問題?

已登出 這個其實蠻有趣的。以文中的這個例子來講,為避免歧義,我用abc替換了原文中的123 public class Singleton public static Singleton getInstance return s f 執行緒A在執行 e 的時候可能是按照重排序後的方式進行的,即下面步驟...