關於子類和父類中的this的用法
阿新 • • 發佈:2018-11-05
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 { 17int num = 2; 18 }
這裡面的this很奇怪,為什麼輸出結果是1,this不是指向當前物件麼,當前物件不是子類的例項麼?例如父類有get和set方法,裡面應該有this關鍵字,當子類繼承父類時,呼叫get和set方法時,this關鍵字如何區分呼叫的是子類的filed還是父類的filed(假設有同名的filed)?
這個問題由@NewMoons網友做出了講解:
在繼承多型中:
1、對於方法的覆蓋,new的誰就調誰,這就是多型。
2、對於成員變數的覆蓋,this在哪個類就指向哪個類的成員變數,沒有多型。
並給出了一段精彩的程式碼:
1 public classDemo { 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 publicString 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 }