动态绑定是指“在执行期间(而非编译期)”判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也叫多态。
有三个特征:有继承、有重写、父类引用指向子类
一、实例
本例,在学校里的体育上,所有女生都选择了打羽毛球,所有男生都选择了打篮球。
有继承:编写学生类,分别写girls类和boys类,继承学生类
有重写:三个类中均有Cource()方法,子类对父类的方法进行重写
父类引用指向子类:在teacher类中,传参为父类student类,实际传参为子类的实例。
在主函数中调用teacher类中的方法,在teacher类中的方法调用父类的方法。
class Student{
public String name;
public void Cource(){
this.name = name;
System.out.println(this.name + "在学校");
}
}
class girls extends Student{
public void Cource(){
System.out.println("在学习打羽毛球");
}
}
class boys extends Student{
public void Cource(){
System.out.println("在学习打篮球");
}
}
class teacher {
public String name;
public Student student;
teacher(String name, Student student){
this.name =name;
this.student = student;
};
public void myStudentStudying(){
student.Cource();
}
}
public class PolymorphTest {
public static void main(String[] args) {
girls g1 = new girls();
boys b1 = new boys();
teacher t1 = new teacher("Lily",g1);
teacher t2 = new teacher("John",b1);
t1.myStudentStudying();
t2.myStudentStudying();
}
}
运行结果:
二、内存分析
通过实例,可以看出,当使用 student.Cource();,在运行期间,先判断student的实际类型,在对应访问实际类型的Cource方法。
则如当新增一个类型C,只需增加子类C,改写相应的Cource即可,如下
class C extends Student{
public void Cource(){
System.out.println(“在学习java”);
}
}
增强了代码的可扩展性。