Java中的多态是面向对象编程的重要特性之一。
最近复习Java基础,发现自己忽略了多态中的动态绑定机制。
确实比较绕,记录于此加深理解,希望对大家也有帮助。
参考了韩顺平老师的零基础学Java,讲得非常细,B站链接:https://www.bilibili.com/video/BV1fh411y7R8?p=315
一、简单回顾下Java多态:
-
方法的多态:重载和重写
-
对象的多态:编译看左,运行看右
- 例:
Animal animal = new Dog();
- 编译类型:Animal
- 运行类型:Dog
- 例:
-
向上转型:父类引用指向子类对象
- 父类类型 引用名 = new 子类类型()
- 可以调用父类成员,需遵守访问权限(无法直接访问父类中private修饰成员)
- 向上转型后,不能调用子类特有成员,因为编译类型是父类,调用子类特有成员无法通过编译
-
向下转型:调用子类特有的成员
- 子类类型 引用名 = (子类类型) 父类引用
- 向下转型后,编译类型和运行类型都是子类,因此可以调用子类所有成员
- 父类引用必须指向的是当前目标类型的对象
// Cat Dog 分别继承 Animal Animal animal = new Cat(); // 向上转型 Cat cat = (Cat) animal; // 向下转型 Dog dog = (Dog) animal; // 编译成功,但运行报错,类转换异常
二、动态绑定机制——简要版
- 当调用对象方法时,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象成员变量时,没有动态绑定机制,哪里声明,那里使用
三、动态绑定机制——详解
1a. 父类、子类定义如下
class Father {
public int num = 10;
public int sum1() {
return getNum() + 10;
}
public int sum2() {
return num + 10;
}
public int getNum(