持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
1️⃣前言
大家好,我是翼同学。今天笔记的内容是:
- 多态
2️⃣内容
2.1、什么是多态?
我们将一个对象变量可以引用多种实际类型的现象称为多态。
在继承机制中,每个子类的对象都属于父类的对象,这体现了is-a
规则,也就是说,程序中出现的父类对象都可以用子类对象置换。我们可以将一个子类的对象赋给父类变量。
2.2、Java 多态
在Java
中,对象变量是多态的。多态使得Java
程序可以有更好的扩展,并可对所有类的对象进行通用处理。
多态的常见形式为:
父类类型 对象名 = new 子类构造器;
// 或者
接口 对象名 = new 实现类构造器;
复制代码
多态存在的必要条件如下:
- 有若干子类继承同一个父类;
- 子类重写了父类中的方法;
- 父类的引用指向了子类对象。
注意:
一个父类变量既可以引用父类对象,也可以引用任何一个子类对象。但是反过来就不行。我们不能将一个父类的引用赋给子类变量,这是非法的。
在多态的形式下,定义方法时使用父类类型作为参数,该方法就可以接受父类的一切子类对象,对象可以实现解耦合,更便于维护,也体现了多态的扩展性。
2.3、多态的举例
父类如下所示:
// 动物类
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
)的对象执行同一个行为,会表现出不同的行为特征。又由于多态更加侧重于行为多态,因此变量的调用和方法调用是不同的。
2.4、虚函数与动态绑定
虚函数的存在是为了多态。但在Java中,并没有虚函数的概念。事实上Java的普通方法就相当于C++的虚函数。如果对方法加上final
修饰符后,就可以去掉Java中方法的虚函数特性。
另外,在运行时能够自动选择调用哪个方法的现象被称为动态绑定。对于Java来说,动态绑定是默认的处理方式。
3️⃣写在最后
好了,今天的笔记就记到这里。