继承创建类型兼容性.它允许超类引用引用子类的对象.(反向不是真的).
引用子类对象的超类引用只能用于访问子类的继承和重写方法.使用超类的引用无法访问子类中新定义的成员.
class A {
void f1() { //this holds address of object of B
System.out.println("A f1");
}
void f2() {
System.out.println("A f2");
}
}//A
class B extends A {
void f3() { //new method
System.out.println("B f3");
}
void f2() { //this holds address of object of B
System.out.println("B f2 starts");
f3(); //this.f3()
System.out.println("B f2 ends ");
} } //B
class TypeCmptbl {
public static void main(String args[]) {
A ref; //reference of A
ref = new B();//Object of B
//ref.inherited() allowed
ref.f1();
//ref.overridden() allowed
ref.f2();
//ref.newMembersOfChild() not allowed
//ref.f3();
}//main
}
Run Code Online (Sandbox Code Playgroud)
考虑一下这句话
ref.f2();
Run Code Online (Sandbox Code Playgroud)
这里ref是A类的引用,它有B类对象的地址f2()是一个重写方法.
当编译器检测到这样的语句时,它不会将函数调用与任何定义绑定.它只验证通话.
此类调用的绑定留给运行时环境.在程序运行时,系统识别对象的数据类型,并使用对象类提供的函数定义绑定函数调用.函数调用和函数定义之间的这种类型的绑定称为"后期绑定"或" 运行时绑定 "或" 运行时多态 "或" 动态方法调度 ".