先不多说,直接上代码
Teacher.java
package jz.file.polymorphism;
public class Teacher {
public void getHomework(){
System.out.println("Teacher.getHomework()~~");
}
}
CnTeacher.java
package jz.file.polymorphism;
public class CnTeacher extends Teacher{
/**
* 重写一下父类的方法
*/
@Override
public void getHomework() {
System.out.println("CnTeacher.getHomework()~~");
}
/**
* 创建一个自己的方法
*/
public void readChinese(){
System.out.println("hello chinese");
}
}
接下来我们开始
package jz.file.polymorphism;
public class Polymorphism {
public static void main(String args[]) {
Teacher t1 = new Teacher();
t1.getHomework();
Teacher t2 = new CnTeacher();
t2.getHomework();
// /**1.*/t2.readChinese();
// /**2.*/((CnTeacher)t2).readChinese();
CnTeacher t3 = new CnTeacher();
t3.getHomework();
t3.readChinese();
// /**3.*/((Teacher)t3).getHomework();
// /**4.*/((Teacher)t3).readChinese();
}
}
Teacher.getHomework()~~
CnTeacher.getHomework()~~
hello chinese
hello chinese
打开/**1.*/的注释,结果会报错,
因为此时的t2对象的类型是Teacher,而对于Teacher类型来说,没有readChinese()这个方法.
打开/**2.*/的注释,结果显示为CnTeacher.getHomework()~~
这里有一个动态绑定的问题.
首先说getHomework()这个方法,在"new CnTeacher()"的时候,首先调用父类的构造方法"new Teacher()",这样,在代码段中就分配了两个getHomework()的方法的空间.而在堆空间中,分别有Teacher和CnTeacher两个实例.
这样的话,问题就来了.那我在调用getHomework()这个方法的时候,系统是根据什么判断我们调用哪个方法呢?
这里就要涉及到那个动态绑定思密达.
所谓的动态绑定,就是指在程序运行的时候,动态地绑定方法.
好比我们刚才举的那个例子,在程序运行过程中,创建了CnTeacher和Teacher的对象,那么在绑定方法的时候,就是根据创建的对象来调用方法.
换句人话说,就是,new的谁,就用谁的方法.
打开/**3.*/的注释,结果和2是一样的,同样是向上转型的情况
打开/**4.*/的注释,结果报错.
想上转型后,新规的方法将不会被看到.