本系列博客是韩顺平老师java基础课的课程笔记,B站:课程链接,吐血推荐的一套全网最细java教程,获益匪浅!
1. 基本介绍
多态指的就是方法或者对象具有多种状态,是面向对象的第三大特征,多态是建立在封装和继承基础之上的
2. 具体表现
- 方法的多态:方法的重载和重写体现了方法的多种状态
- 对象的多态
-
- 一个对象的编译类型和运行类型可以不一致:可以将父类的引用指向子类的对象 Animal animal=new Dog() animal的编译类型是Animal , 运行类型是Dog
-
- 编译类型在定义对象时,就确定了,不能改
-
- 运行类型是可以变化的(多态): animal=new Cat() 此时 animal的运行类型变成了cat,编译类型仍然是animal
-
- 编译类型看定义时 = 号的左边,运行类型看= 的右边

3. 细节
多态的向上转型
- 本质:父类的引用指向了子类的对象
- 语法:父类类型 引用名= new 子类类型()
- 特点:编译类型看左边,运行类型看右边。
- 向上转型的调用方法如下:
-
- 可以调用父类中的所有成员(需遵守访问权限)
-
- 不能调用子类的特有成员,因为在编译阶段,能调用哪些成员是由编译类型决定的。
-
- 最终运行效果看子类的具体实现,先从子类(运行类型)开始找,子类没有就找父类。
多态的向下转型
- 语法:子类类型 引用名=(子类类型)父类引用
- 只能强转父类的引用,不能强转父类的对象
- 要求父类的引用必须原本就是指向,强转后的子类对象
- 可以调用子类类型中的所有成员
其他
- 属性没有重写一说,属性的值看编译类型,所以说:方法调用看运行类型,属性调用看编译类型!
- instanceOf 比较操作符,用于判断对象的运行 类型是否为XX类型或者是XX类型的子类型
4. 动态绑定机制 💗(P315)
- 当调用对象的方法时,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象的属性时,没有动态绑定机制,哪里声明,哪里使用
5. 应用
多态数组
- 数组的定义类型为父类类型,里面保存的实际元素类型为子类类型

多态参数
- 方法定义的形参类型为父类类型,实参类型允许为子类类型

多态的规则真的挺复杂的…单独拿出一篇博客记录吧~