问题描述
Father father = new Sun;
father.属性 调用的是父类的属性值还是子类的?
father.方法 调用的是父类的方法还是子类的方法?
问题结果
父类的
子类的(方法的重写,一定是调用子类的)
原因:使用父类的引用指向子类的对象,该引用调用的是父类中定义的方法和变量,变量不能被重写(覆盖);如果子类中重写了父类的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法。
特殊情况:如果该父类引用所调用的方法参数列表未定义,就调用该父类的父类中查找,如果还没找到就强制向上类型转换参数列表中的参数类型,具体优先级高到低依次如下:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
经典实例:
package extend2;
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b));
//A and A
System.out.println(a1.show(c));
//A and A
System.out.println(a1.show(d));
//A and D
System.out.println(a2.show(b));
//B and A
System.out.println(a2.show(c));
//B and A
System.out.println(a2.show(d));
//A and D
System.out.println(b.show(b));
//B and B
System.out.println(b.show(c));
//B and B
System.out.println(b.show(d));
//A and D
}
}
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
结果下面注释有
牢记上面的红字就可以解释这些答案