1. 程式人生 > >關於子類和父類中的this的用法

關於子類和父類中的this的用法

 1 public class Demo {
 2     public static void main(String[] args) {
 3         Fu f = new Zi();
 4         f.show();
 5     }
 6 }
 7  
 8 class Fu {
 9     int num = 1;
10  
11     void show() {
12         System.out.println(this.num);
13     }
14 }
15  
16 class Zi extends Fu {
17
int num = 2; 18 }

這裡面的this很奇怪,為什麼輸出結果是1,this不是指向當前物件麼,當前物件不是子類的例項麼?例如父類有get和set方法,裡面應該有this關鍵字,當子類繼承父類時,呼叫get和set方法時,this關鍵字如何區分呼叫的是子類的filed還是父類的filed(假設有同名的filed)?


這個問題由@NewMoons網友做出了講解:

在繼承多型中:
1、對於方法的覆蓋,new的誰就調誰,這就是多型。
2、對於成員變數的覆蓋,this在哪個類就指向哪個類的成員變數,沒有多型。

並給出了一段精彩的程式碼:

 1 public class
Demo { 2 public static void main(String[] args) { 3 Fu f = new Zi(); 4 5 System.out.println(f.num);//這裡定義的是父類,而成員變數沒有多型,所以即使你new的子類,依然指向父類的成員變數。 6 System.out.println(f.fun1());//不解釋了,就是多型。 7 f.show(); 8 } 9 } 10 11 class Fu { 12 public
String num = "父類成員變數"; 13 14 public void show() { 15 System.out.println(this.num);//因為成員變數沒有多型,所以this指向當前類物件的成員變數。 16 System.out.println(this.fun1());//因為方法有多型,所以this指向new物件的方法。 17 } 18 19 public String fun1() { 20 System.out.println(this.num);//因為成員變數沒有多型,所以this指向當前類物件的成員變數。 21 return "父類呼叫"; 22 } 23 } 24 25 class Zi extends Fu { 26 public String num = "子類成員變數"; 27 28 public String fun1() { 29 System.out.println(this.num);//因為成員變數沒有多型,所以this指向當前類物件的成員變數。 30 return "子類呼叫"; 31 } 32 }