程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java-關於JAVA的this關鍵字

java-關於JAVA的this關鍵字

編輯:編程綜合問答
關於JAVA的this關鍵字

網上對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 會產生不可預知的結果。如果想改變基類的行為 重載他的函數 重新定義新的行為。

希望能幫到你

lendofworld
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved