public class Father{
Father(){
aa();
}
public void aa(){
System. out.println("father's aa");
}
}
public class Son extends Father{
Son(){
}
public void aa(){
System.out.println("son's aa");
}
public static void main(String args[]){
 new Son();
}
}本人知道他是因为动态绑定才会输出son's aa 但为什么动态绑定他就找最终子类的在父类申明有接口的方法   也有这样的输出方式 Father father = new  Son();father.aa(); 书上说因为编译前father不知道后面是什么,直到运行时才知道 麻烦能讲深点

解决方案 »

  1.   


    Father father = new  Son();//只是实例化Son之后,把这个乡上转型为Father 类型,但是它没有丢掉自己的原来类型,因为java是执行期辨别机制,我说的是非静态方法,所以执行期jvm会找到它原来的类型,并且执行相应的方法father.aa(); 
      

  2.   

    这是基本概念 “覆盖”,override,你baidu一下了就清楚了。
      

  3.   


    确实向上转型为Father 但是他输出的是子类覆盖的方法的内容阿 像一般在父类中没有子类扩充的方法 父类是看不到的 这样写father是调用不了的  只有覆盖父类的方法 他才调用子类的相同方法
      

  4.   

    ni你还是对基本概念理解不清啊,
    最终调用哪个方法,是看实际的对象是哪个类的,而不是看你声明的是什么类型。对象是a的就调a的,对象是b的就调b的。