比如 
Animals类里有eat();方法
wolf 类 extends Animals 这个类;
然后wolf里重写eat();方法那么我Animals an = new wolf();
然后 an.eat(); 请问是调用父类还是子类的方法啊?
我看书上说的貌似是子类的方法.
如果能具体阐述下 父类类型的引用变量 被赋值 为一个子类的对象 时,JVM编译和运行时的工作原理就更好了,谢谢哈

解决方案 »

  1.   

    1.如果eat方法在父类中是私有的,则调用父类中的eat方法
    2.如果是发生重写,则在运行时会发生动态绑定,调用子类方法
      

  2.   

    1.如果eat方法在父类中是私有的,则调用父类中的eat方法 
    那么,如果父类中eat();是private 的话,我子类中再写个eat();方法,参数和返回类型等完全相等的情况下,他们2个方法有什么联系么???
      

  3.   

    1.如果eat方法在父类中是私有的,则调用父类中的eat方法 ?????????这个没听过.而且你别妄想在其他类中(子类也不可以)调用人家类的私有东东.
    2.如果是发生重写,则在运行时会发生动态绑定,调用子类方法.
    但是注意,如果子类中没有没有重写eat方法,那就会调用父类的eat方法.
    也既是决定了可以访问什么成员的是引用变量的类型,而不是它引用的对象的类型.也就是说将一个子类对象的引用赋给一个超类引用变量时,只可以访问有超类所定义的那部分对象.
    关于1实在那是没听过.有错在讲.
      

  4.   

    子类想和父类产生关系只有用super.
    其中一种是super()构造函数(不写就默认)且自动调用它extends的那个父类的构造函数.
    另一种就是super.父类的非私有东东.
    子类影响父类,就不行了.儿子的基因变异是不会影响到他老爹的.
      

  5.   

    如果能具体阐述下 父类类型的引用变量 被赋值 为一个子类的对象 时,JVM编译和运行时的工作原理就更好了是这样的你父类在栈内开辟了一个父类引用,其实就是一个指针。但你new+构造()子类对象放在内存的哪里呢?是在堆中,有这个子类对象的空间,以及他的属性空间和和指向方法区的引用。既然是一个实实在在的子类,那么调用的都是子类的东西。至于楼上几位说的父类private方法,子类根本就继承不过去也就不存在什么重写,只是在子类写了一个和父类方法名一样,返回类型一样,参数类型,数量一样的独立方法。和父类的那个方法无关。不知道lz是否明白一点了
      

  6.   

    大致理解到了,恩恩感觉 Animals an = new Wolf();   an.eat(); 
      和 Wolf w = new Wolf();       w.eat(); 
    效果都一样!
    引用变量的类型对其没什么影响样只是原理不一样,
    比如前者以Animals作为引用变量的类型,那么在调用的时候检查到有重写的存在,在运行时会发生动态绑定,调用子类方法;
    而后者以Wolf作为引用变量的类型,那么调用的时候就以Wolf类作为起点,然后找eat();方法,如果有就调用,如果没有,就去父类寻找;
    简而言之就是: Animals开头的话,是从父类找;
                 Wolf开头的话,是从子类开始找;

    不知道理解得对不对??