/** * java动态绑定与转型 * * 动态绑定 Java中除了static和final方法外,其他所有的方法都是运行时绑定的。 * 转型:如果把引用变量转换成子类类型称为向下转型,把引用变量转换成父类类型称为向上转型。 * * 对于一个引用类型变量,编译期按照它声明的类型处理,运行时按照它实际引用的对象处理。 * 成员变量,静态方法按照引用变量声明的类型静态绑定(早期绑定)。 * 实例方法按照引用类型引用的实例动态绑定(后期绑定|运行时绑定)。 */ public class Polymorphism { public static void main(String[] args){ Person p = new Male(); //System.out.println(p.mVar); //错误 编译期按照p声明的类型(Person)处理 //p.mMethod(); //错误 编译期按照p声明的类型(Person)处理 //访问Male的成员要进行强制类型转换 Male m = (Male)p; System.out.println(m.mVar); m.mMethod(); System.out.println(p.var); //编译期静态绑定p所声明的类型(Person) p.method(); //运行时调用p所引用的实例对象(Male)的方法 //男人是人,女人是人,人不一定是男人,也不一定是女人,只有原来是男人的人才能转化成男人 p = new Person(); //m = (Male)p; //编译时通过,运行时异常 将人转化成男人 p = new Male(); //将人实例化成男人 //Famale f = (Famale)p; //编译时通过,运行时异常 将男人转化成女人 m = (Male)p; //正确 将原本是男人的人转化成男人 } } class Person { String var = "Person var"; String pVar = "Person pVar"; public void pMethod(){ System.out.println("Person method"); } public void method(){ System.out.println("Person method"); } } class Male extends Person{ String var = "Male var"; String mVar = "Male sVar"; public void mMethod(){ System.out.println("Male method"); } public void method(){ System.out.println("Male method"); } } class Famale extends Person{ String var = "Famale var"; String mVar = "Famale sVar"; public void fMethod(){ System.out.println("Famale method"); } public void method(){ System.out.println("Famale method"); } }