一、父类引用指向子类对象时
-
若子类覆盖了某方法,则父类引用调用子类重新定义的新方法
-
若子类未覆盖某方法,则父类引用调用父类本身的旧方法
-
若子类覆盖了某属性,但父类引用仍调用父类本身的旧属性
-
若子类未覆盖某属性,则父类引用调用父类本身的旧属性
-
父类引用不能访问子类新定义的属性和方法
二、子类引用指向自身对象时
-
若子类覆盖了某方法,则子类引用调用子类重新定义的新方法
-
若子类未覆盖某方法,则子类引用调用父类本身的旧方法
-
若子类覆盖了某属性,则子类引用调用子类重新定义的新属性
-
若子类未覆盖某属性,则子类引用调用父类本身的旧属性
-
子类引用可以访问子类新定义的方法
public class Test {
class Dad {
public String name = "Dad";
void f1() {
System.out.println("Dad f1");
}
void f2() {
System.out.println("Dad f2");
}
}
class Son extends Dad {
public String name = "Son";
@Override
void f2() {
System.out.println("Son f2");
}
void f3() {
System.out.println("Son f3");
}
}
@org.junit.Test
public void test() {
Son son = new Son();
Dad dad = new Son();
dad.f1();
dad.f2();//子类重写了该方法,因此调用子类中重写后的方法
// dad.f3();//无法访问子类中新增方法
System.out.println(dad.name);//依然调用父类中的属性
son.f1();
son.f2();
son.f3();
System.out.println(son.name);
}
}
输出如下
Dad f1
Son f2
Dad
Dad f1
Son f2
Son f3
Son