網上對this的描述很朦胧,有的說this表示的是當前對象自己,有的說this是當前對象的引用。
可是自己寫了如下的測試代碼,產生了幾個問題:
1 public class T3AboutThis {
2
3 public static void main(String[] args) {
4 new SubT3().func();
5 SuperT3 s = new SuperT3();
6 System.out.println(s instanceof SubT3);//false
7 }
8 }
9
10 class SuperT3 {
11 protected String name = "Jack";
12
13 protected void func() {
14 System.out.println(this.name);//Jack
15 System.out.println(this instanceof SuperT3);//true
16 System.out.println(this instanceof SubT3);//true
17 }
18 }
19 class SubT3 extends SuperT3 {
20 protected String name = "Peter";
21 }
1.this表示的是指向一個實例嗎。如果不是指向一個實例,那麼為什麼this可以參與instanceof運算或當作引用參數傳進方法裡,super為什麼不能?
2.如果this表示當前對象,那麼我在第4行new的SubT3的實例,在第14行為什麼沒有打印出peter呢。
3.如果在第14行時,this只表示SuperT3的引用(我也不知道到底引用什麼),那為什麼第16行沒有打印出與第6行相同的結果呢?
我真的是有點繞暈了。
1.this表示的是指向一個實例嗎。如果不是指向一個實例,那麼為什麼this可以參與instanceof運算或當作引用參數傳進方法裡,super為什麼不能?
-- this表示的是指向一個實例。 System.out.println(s instanceof SubT3);//false 這個地方之所以返回false 是因為 s的類型是 SuperT3 所以 “s instanceof SubT3” 是返回false
2.如果this表示當前對象,那麼我在第4行new的SubT3的實例,在第14行為什麼沒有打印出peter呢。
--首先說this的類型是SubT3 這是確定的,所以this instanceof SuperT3 和 this instanceof SubT3都是true. 第14行打印出Jack是正確的。要從內存結構看,子類是無法覆蓋父類的成員變量的,所以對於SubT3 來說裡面有兩個 name, 一個是Jack 一個是peter。那麼究竟是調用哪個name呢?是調用基類的name,因為成員變量是不能重載的,也就是說 調用成員變量的函數在基類中 則使用基類的成員變量 調用成員變量的函數在子類中則使用子類中的成員變量。 如果想要 輸出peter,只需要在SubT3 重載func 也就是將func的代碼復制在SubT3中 就會輸出peter. 記住:成員變量是不會被重載的 只有 函數會被重載。
3.如果在第14行時,this只表示SuperT3的引用(我也不知道到底引用什麼),那為什麼第16行沒有打印出與第6行相同的結果呢?
--看第2條的回答 this不是superT3 是 subT3 只是因為成員變量是無法重載的 依賴於調用它的函數所在類。
另外說明一下,如果基類的成員變量可以被同名的子類中成員變量替換,那會產生災難的後果。比如基類中有個數組 裡面存儲了一些 標識 比如 0 1 2 而在子類中 聲明了同樣一個名字的數組 裡面是 3 4 5 那麼基類運行到基類的方法的時候 本來處理 0 1 2 現在卻處理 3 4 5 會產生不可預知的結果。如果想改變基類的行為 重載他的函數 重新定義新的行為。
希望能幫到你