java中多态的再理解

java中多态的再理解

注意:在Animal类和Dog类中分别加上一个静态方法show()

  • Animal dog = new Dog();
    这个时候在栈中产生了一个变量类型为Animal的dog变量。之后new对象,在堆空间中创建了一个Dog类的对象
  1. 调用属性dog.age是调用的哪个呢?
    首先dog的变量类型其实是Animal的,那么我们访问dog.age时,其实是访问的Animal中的age,也就是dog.age = 1
  2. 调用静态方法dog.show调用的是哪个呢?
    再次声明dog的变量类型其实是Animal的,而静态方法属于类本身,所以dog.show()调用的是Animal中的静态方法
  3. 调用非静态方法dog.eat(),调用的是哪个呢?
    当我们调用重写父类的方法时,多态性就体现出来了。当运行非静态成员方法时,JVM会动态绑定到之类对象中去,运行子类的重写方法。所以当dog.eat()时,调用的是Dog中的eat方法。
  4. 调用子类特有的方法dog.seeHouse(),调用的是哪个呢?
    再次声明dog的变量类型其实是Animal的,而Animal中并没有seeHouse()方法所以编译出错。

总结:

  • 除开非静态方法以外的成员,编译和运行都看左边。编译和运行期间,JVM静态绑定在父类当中
  • 非静态方法,编译看左边,运行看右边。JVM动态绑定到子类对象中,运行的是子类重写的方法

以上属于本人自己的理解,如有错误,敬请大家批评指正。