class Father{
void set(){
System.out.println("Father‘s set!");}
void differ1(){
System.out.println("differ1");}
}class Son extends Father{
void set(){
System.out.println("Son's set!");}
void differ2(){
System.out.println("differ2");}public static void main(String[] args){
Father f=new Son();
f.set();                                //输出的结果为Son's set!
f.differ1();                            //输出的结果为differ1
f.differ2();                            //编译错误。找不到该方法
}
}如上面的例子(我用记事本写的,可能有笔误)。
我有个疑问:不应该是变量是静态绑定,方法是动态绑定么?那么f的引用指向的应该是Son的对象,调用的方法应该是son中的方法。那么f.differ2()为什么找不到该方法呢?同样是调用方法,为什么调用重写的set方法为什么是Son的set方法呢?请问原因是什么?我对这个问题很迷糊。。

解决方案 »

  1.   

    f.differ2()不是方法的重写,这个是son新增加的方法新增的方法是不会“多态”的
      

  2.   

    多态的条件: 
    1.要有继承     
    2.要有方法的重写  
    3.父类引用指向子类对象 LZ不要重复发贴了http://topic.csdn.net/u/20090426/16/02b0ad12-2843-4ab1-8d31-d92c2a7b20cb.html另外要记得结贴,不然没人回你啦
      

  3.   

    使用父类作为引用句柄,并赋给其子类的实例,只能使用父类的动作(向上还原),因此找不到子类才有的differ2()
    set()楼主正好在father的子类中覆盖了,实际运行时根据动态绑定,jvm决定了调用子类的该方法
    differ1()方法未在子类中覆盖,因此实际调用的肯定是父类的。
      

  4.   

    不是说方法就是动态绑定的么?
    那为什么“能使用父类的动作(向上还原),因此找不到子类才有的differ2() ”
     动态绑定不是应该使用new后面跟的对象的方法么?