java中多态的再理解
注意:在Animal类和Dog类中分别加上一个静态方法show()
- Animal dog = new Dog();
这个时候在栈中产生了一个变量类型为Animal的dog变量。之后new对象,在堆空间中创建了一个Dog类的对象
- 调用属性dog.age是调用的哪个呢?
首先dog的变量类型其实是Animal的,那么我们访问dog.age时,其实是访问的Animal中的age,也就是dog.age = 1 - 调用静态方法dog.show调用的是哪个呢?
再次声明dog的变量类型其实是Animal的,而静态方法属于类本身,所以dog.show()调用的是Animal中的静态方法 - 调用非静态方法dog.eat(),调用的是哪个呢?
当我们调用重写父类的方法时,多态性就体现出来了。当运行非静态成员方法时,JVM会动态绑定到之类对象中去,运行子类的重写方法。所以当dog.eat()时,调用的是Dog中的eat方法。 - 调用子类特有的方法dog.seeHouse(),调用的是哪个呢?
再次声明dog的变量类型其实是Animal的,而Animal中并没有seeHouse()方法所以编译出错。
总结:
- 除开非静态方法以外的成员,编译和运行都看左边。编译和运行期间,JVM静态绑定在父类当中
- 非静态方法,编译看左边,运行看右边。JVM动态绑定到子类对象中,运行的是子类重写的方法
以上属于本人自己的理解,如有错误,敬请大家批评指正。