向上转型和动态绑定机制
程序员文章站
2024-03-21 19:12:16
...
多态的实现可以借由向上转型和动态绑定机制来完成,其中,向上转型实现了将子类对象向上转型为父类类型;而动态绑定机制能识别出对象转型前的类型,从而自动调用该类的方法,两者相辅相成。
语法:
-
向上转型
又称为自动转型、隐式转型。即是父类引用指向子类实例,也表示子类的对象可以赋值给父类的对象。向上转型是安全的,因为任何子类都继承并接收了父类的非私有成员方法。 -
绑定机制
绑定就是将一个方法调用同一个方法所在的类连接一起。Java中存在静态绑定和动态绑定。
其中,静态绑定是指在程序运行之前进行绑定(由编译器和链接程序完成的),也叫前期绑定。动态绑定是在程序运行期间由JVM根据对象的类型自动的判断应该调用哪个方法,也叫后期绑定。
应用:
- 向上转型
当一个子类对象向上转型父类类型以后,就被当成了父类的对象,所能调用的方法会减少,只能调用子类重写了父类的方法以及父类派生的方法,而不能调用子类独有的方法。
譬如:图中所示Pencil继承自Pen,完成向上转型后,方法调用报错:The method show() is undefined for the type Pen
,即无法调用不属于Pen的show()方法。
Pen pc = new Pencil();//向上转型
pc.writing();
pc.show();//报错
- 静态绑定的示例:
譬如:有一类Human,它派生出三个子类Chinese类,American类和British类,三个子类中都重写了父类中的方法speak():void
如下图所示,在测试类中用静态绑定的方式调用方法speak()。这种调用方式是在代码里指定的,编译时编译器就知道c调用的是Chinese的speak(),a调用的是American的speak()。
Chinese c = new Chinese();
c.speak();
American a = new American();
a.speak();
British b = new British();
b.speak();
- 动态绑定的示例
如果此时我们在测试类中做一下改动:Human类中随机生成Chinese类、American类和British类的对象,则编译器将不能根据代码直接确定调用哪个类中的speak()方法,知道运行时才能根据产生的随机数n的值来确定human[i]到底代表哪一个子类的对象,这样才能最终确定调用的是哪个类中的speak()方法,这就是动态绑定。
Human[] human = new Human[5];
int n;
for(int i=0;i<human.length;i++){
n = (int)(Math.random()*3);
switch(n){
case 0:human[i] = new Chinese();break;
case 1:human[i] = new American();break;
case 2:human[i] = new British();break;
}
}
for(int j=0;j<human.length;j++){
human[i].speak();
}
下一篇: java 多态性