欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

向上转型和动态绑定机制

程序员文章站 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();
}
相关标签: # JavaSE java