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 }