## 多态(Polymorphism)
多态是面向对象编程的重要特性之一,它可以让不同的对象对同一消息作出响应,实现了对象的动态绑定和调用。
### 修饰词和访问权限
修饰词用于设置成员变量和方法的访问权限,访问权限规则如下:
- `public` > `protected` > 默认(包内可见) > `private`
访问范围 public > protected > 默认的 > private
本类: 可以 可以 可以 可以
同包内: 可以 可以 可以 不可以
子类: 可以 可以 不可以 不可以
其他: 可以 不可以 不可以 不可以
### 多态的条件
多态的实现需要满足以下条件:
1. 必须存在父子类关系。
2. 子类必须重写父类的方法。
3. 使用父类型的引用指向子类型的对象。
### 多态的现象
多态表现在成员变量和成员方法的访问上:
- 成员变量:能够访问的变量取决于引用的类型,执行结果取决于引用的类型(编译看左边,运行看左边)。
- 成员方法:能够调用的方法取决于引用的类型,执行结果取决于对象的类型(编译看左边,运行看右边)。
### 使用多态的问题和解决方法
使用多态时,可能会遇到以下问题:
- 不能访问子类特有的成员。
- 解决方法是向下造型(强制转换),但这可能会引发 `ClassCastException` 异常。
为了避免异常,可以使用 `instanceof` 运算符进行类型判断,确保类型转换的安全性。
```java
if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.catchMouse();
}
```
JDK14 以后,使用 `instanceof` 进行类型判断后,类型转换可以直接在判断中进行。
```java
if (ani instanceof Cat cat) { // JDK14及以后
cat.catchMouse();
}
```
### 多态的意义
多态能够提高代码的灵活性和可维护性,让程序更具可扩展性。通过多态,可以使代码适应未来的变化,降低耦合度,增加系统的可扩展性和可维护性。