多态polymorphic,动态dynamic绑定机制_听韩顺平课笔记
1.养宠物引出多态
2.方法的多态
方法重载体现多态:传入不同参数,调用不同的方法
方法重写体现多态:不同的对象(父子)调用同名的方法,查找的是不同类的方法
3.对象的多态(多态的核心,编译类型,运行类型)
对象的多态核心:
- 一个对象的编译类型和运行类型可以不一致(也可以一致)
- 编译类型在定义对象时,就确定了,不能改变(父类引用指向子类对象)
- 运行类型是可以变化的
- 编译类型看定义时 = 的左边,运行类型看 = 的右边
编译类型,运行类型的代码体现:父类引用指向子类对象,且运行时以运行类型为主
4.多态快速入门
用多态机制同一管理主人喂食问题
5.向上转型
多态的前提是:两个对象(类)存在继承关系
多态的细节:
- 可以调用父类中的所有成员方法(需要遵守访问权限)
- 编译类型决定了,能调用哪些成员(编译器javac决定)
- 最终运行效果看子类的具体表现(编译通过了,从运行类型开始查找方法调用)
6.向下转型
为什么要向下转型?调用子类特有的方法
- 只能转父类的引用,不能转父类的对象
- 父类的引用必须指向当前目标类型的对象(猫不能转为狗)
7.属性重写问题(属性没有多态,属性的值看编译类型)
属性没有多态这一说,属性的值看编译类型:
instanceOf判断的是运行类型
8.多态练习
9.多态练习
- 属性的调用,看编译类型
- 方法的调用,看运行类型(b.display(),this.count,任然看的运行类型的count,这里的this.count != b.count)
10.动态dynamic绑定机制(非常重要)
- 将子类的sum()注销,调用a.sum()时输出什么(调用的是父类还是子类的getI()?) => 调用方法时与运行类型绑定
11.多态数组1,多态数组与动态绑定机制
同一个数组,存放不同类型的对象(父类引用指向子类对象)
多态数组与动态绑定机制
12.多态数组2,多态数组调用子类特有方法(类型判断+向下转型),instanceOf判断运行类型
编译类型中没有的方法,无法通过 对象. 来调用
- 多态数组调用子类特有方法(类型判断+向下转型)
13.多态参数(方法定义的形参类型为父类类型,实参类型允许为子类类型)