知識點:
1、java 中父類引用指向子類對象時動態綁定針對的只是子類重寫的成員方法;
2、父類引用指向子類對象時,子類如果重寫了父類的可重寫方法(非private、非 final 方法),那么這個對象調用該方法時默認調用的時子類重寫的方法,而不是父類的方法;
3、對於java當中的方法而言,除了final,static,private 修飾的方法和構造方法是前期綁定外,其他的方法全部為動態綁定;(編譯看左邊,運行看右邊)
本質:java當中的向上轉型或者說多態是借助於動態綁定實現的,所以理解了動態綁定,也就搞定了向上轉型和多態。
package test; public class test{ public static void main(String[] args) { System.out.println("--------父類引用指向子類對象-----------"); Father instance = new Son(); instance.printValue(); //this is Son's printValue() method.---Son instance.printValue2(); //this is father's printValue2() method.---father System.out.println(instance.name); //father instance.printValue3(); //this is father's static printValue3() method. System.out.println("----------創建子類對象------------"); Son son = new Son(); son.printValue(); //this is Son's printValue() method.---Son son.printValue2(); //this is father's printValue2() method.---father System.out.println(son.name); //Son son.printValue3(); //this is Son's static printValue3() method. System.out.println("---------創建父類對象-----------"); Father father = new Father(); father.printValue(); //this is father's printValue() method.---father father.printValue2(); //this is father's printValue2() method.---father System.out.println(father.name); //father father.printValue3(); //this is father's static printValue3() method. } } class Father { public String name = "father"; public void printValue() { System.out.println("this is father's printValue() method.---"+this.name); } public void printValue2(){ System.out.println("this is father's printValue2() method.---"+this.name); } public static void printValue3(){ System.out.println("this is father's static printValue3() method."); } } class Son extends Father { public String name = "Son"; public void printValue() { System.out.println("this is Son's printValue() method.---"+this.name); } public static void printValue3(){ System.out.println("this is Son's static printValue3() method."); } }
分析:
1、父類引用指向子類對象,對象調用的方法如果已經被子類重寫過了則調用的是子類中重寫的方法,而不是父類中的方法;
2、父類引用指向子類對象,如果想要調用子類中和父類同名的成員變量,則必須通過getter方法或者setter方法;
3、父類引用指向子類對象,如果想調用子類中和父類同名的靜態方法,直接子類“類名點” 操作獲取,不要通過對象獲取;
4、父類引用指向子類對象的兩種寫法:(第二種得了解,面試中可能用到)
// 1、第一種常規寫法 Father instance = new Son(); // 2、第二種變形寫法; Son son = new Son(); Father mson = (Father) son;
