为什么没调用addFive方法

解决方案 »

  1.   

    结果应该是3  也就是下面的A 
    属性不存在多态 不存在覆盖 谁调用就是谁的
    不是没有调用addFive()  而是因为多态的原因 方法执行的是子类的方法,将子类中的a属性进行+5操作
    而父类中的却没有改变
    等到输出的时候 调用的是父类中的属性a  因为之前并没有对父类中的a进行操作,所以输出的时候还是
    构造函数里面赋值的那个3
      

  2.   

    它是调用了子类的addFive方法,你在两个addFive方法中加入一个输出语句,这样你就会更清楚它的执行了
      

  3.   

    你子类的addFile方法跟父类是一样的,这肯定不是覆写,是直接继承的,所以执行foo.addFive();方法,是执行的父类的方法,又public void addFive(){
    this.a+=5;
    },也就是该方法是使用父类成员变量进行操作的
      

  4.   

    LZ去看看这个帖子……很多人解释的很清楚了,和你的问题关键点都一样
    http://bbs.csdn.net/topics/390457048
      

  5.   


    Foo foo = new Bar();
    //调用方法时,使用的是实际对象的方法,既,此处的addFive()是执行了子类Bar.addFive方法
    foo.addFive();
    //引用对象属性时,若属性名相同,会引用声明类型域的属性,既Foo.a
    System.out.println("value:"+foo.a);
    子类的方法是调用了的,子类的a也是改变了的,只是最后打印的是父类的a
      

  6.   

    结果应该是3父类引用指向子类对象(多态),方法是后期绑定的,而成员变量是不支持后期绑定的,也就是说,成员变量的归属是跟随引用的,而方法的归属是跟随对象的。所以在执行的过程中,相当于调用了子类的addFive方法,操作了子类的成员变量,输出的时候获取的又是父类的成员变量整个过程的操作都是针对子类的,父类的成员变量并没有任何改变。
      

  7.   

    应为Foo foo=new Bar 也就是说子类对象赋值给了父类,那fool 为上转型,它应该只能调用从父类继承的变量好人方法,或者是隐藏的变量以及重写的方法。主要考的是上转型这个概念。
      

  8.   


    补充下,如果增加个getter方法,改造下,就能得到预期的结果了:
    System.out.println("value:"+foo.getA());
      

  9.   

    所以主函数调用的函数是1,调用父类的构造函数(a=3)2,调用子类重写的AddFive函数即子类的变量a为8注意此时父类的a还是3,所以答案是3