持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
大家好,我是翼同学。今天笔记的内容是:
我们将一个对象变量可以引用多种实际类型的现象称为多态。
在继承机制中,每个子类的对象都属于父类的对象,这体现了is-a
规则,也就是说,程序中出现的父类对象都可以用子类对象置换。我们可以将一个子类的对象赋给父类变量。
在Java
中,对象变量是多态的。多态使得Java
程序可以有更好的扩展,并可对所有类的对象进行通用处理。
多态的常见形式为:
- 父类类型 对象名 = new 子类构造器;
- // 或者
- 接口 对象名 = new 实现类构造器;
- 复制代码
多态存在的必要条件如下:
注意:
一个父类变量既可以引用父类对象,也可以引用任何一个子类对象。但是反过来就不行。我们不能将一个父类的引用赋给子类变量,这是非法的。
在多态的形式下,定义方法时使用父类类型作为参数,该方法就可以接受父类的一切子类对象,对象可以实现解耦合,更便于维护,也体现了多态的扩展性。
父类如下所示:
- // 动物类
- abstract class Animals {
- public String name = "Animals";
- abstract void eat();
- }
- 复制代码
下面是两个子类:
- // 子类1:猫类
- class Cat extends Animals {
- public void eat() {
- System.out.println("猫吃猫粮");
- }
- }
-
- // 子类2:狗类
- class Dog extends Animals {
- public void eat() {
- System.out.println("狗吃狗粮");
- }
- }
- 复制代码
最后是主类的测试:
- public class Test {
- public static void main(String[] args) {
- // 多态-> 父类类型 变量名 = new 子类构造器;
- Animals a1 = new Cat();
- Animals a2 = new Dog();
- // 调用方法
- a1.eat();
- a2.eat();
- // 调用属性
- System.out.println(a1.name);
- System.out.println(a1.name);
- }
- }
- 复制代码
运行结果如下:
- 猫吃猫粮
- 狗吃狗粮
- Animals
- Animals
- 复制代码
可以看到,同一个类型(Animals
)的对象执行同一个行为,会表现出不同的行为特征。又由于多态更加侧重于行为多态,因此变量的调用和方法调用是不同的。
虚函数的存在是为了多态。但在Java中,并没有虚函数的概念。事实上Java的普通方法就相当于C++的虚函数。如果对方法加上final
修饰符后,就可以去掉Java中方法的虚函数特性。
另外,在运行时能够自动选择调用哪个方法的现象被称为动态绑定。对于Java来说,动态绑定是默认的处理方式。
好了,今天的笔记就记到这里。