请问一下大家,父类的引用指向子类对象,假如子类有重写父类的方法,有跟父类相同的属性,为什么这引用调用的方法是子类的,调用的属性却是父类的。

解决方案 »

  1.   

    属性是不会被子类覆盖的,即子类父类各有自己的属性!
    而父类的方法却可以被子类覆盖,所以当调用父类所引用的子类对象的方法时会调用覆盖后的方法!
    其实本质上是每个子类的对象中都包含一个父类的对象(from <<Thinking in java>>),当子类重写父类的方法时
    子类对象中包含的父类对象就会被覆盖
      

  2.   

    对于多态,可以总结它为:
      一、使用父类类型的引用指向子类的对象;
      二、该引用只能调用父类中定义的方法和变量;
      三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
      四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。详见此文章:Java多态性详解——父类引用子类对象
      

  3.   

    其实你的问题是java中面向对象的三大特征中的:继承和多态问题!
    其实计算机语言中的文字表示很多与现实中是一样一样的!
    继承就是父母的财产让自己的子女继承,这中间子女的财产有哪些呢?一部分是自己辛辛苦苦赚的,另一部分是从父母那里继承下来的(不过他原本属于父母的,只是自己同时也可以拥有了)。而多态里面的重写,其实也是在验证java中的继承问题。重写,顾名思义,就是子类重写父类的方法!
    如父亲有块金子,你嫌他不好看,给他打成手镯送给自己的女朋友!(这里面所说的是,金子本质上没变,变得是他的形状和用途。这也就是重写的方法名及类型没变,变得是方法体的内容)。现在落实问题,当调用父类方法时,如果该父类的方法同时被子类重写的话。就好比父亲给了儿子(其实父类拥有他的支配权,还有他的管辖),所以你找那个东西(方法),要像儿子要。
    如果没有给儿子的东西(没有被儿子重写的方法),调用父类的方法还是父类的