Java 多态
概念
面向对象的程序设计语言的三大支柱是封装,继承,多态。
封装:根据功能将属性和方法封装到一个类中
继承:实现代码重复利用,避免相同作用代码重复编写(类似函数)
多态:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作
多态性是对象多种表现形式的体现。
多态存在的必要条件
- 要有继承关系
- 要有方法重写
- 要有父类引用指向子类对象:Parent p = new Child();
多态中的成员访问特点
1.成员变量:
编译看左边,运行看右边。
2.构造方法:
创建子类对象的时候,访问父类的构造方法。对父类的数据进行初始化。
3.成员方法:
编译看左边,运行看右边。
4.静态方法:
编译看左边,运行看左边。
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
以下是一个多态实例的演示:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
运行结果
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
instanceof关键字
它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型
object Human = new Animal();
if(Human instanceof Animal){
System.out.println("Human is Animal");
}
多态的优点
多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
重写
我们将介绍在 Java 中,当设计类时,被重写的方法的行为怎样影响多态性。
我们已经讨论了方法的重写,也就是子类能够重写父类的方法。
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。
要想调用父类中被重写的方法,则必须使用关键字 super。
多态的转型
多态本身就是向上转型过的过程
- 使用格式:父类类型 变量名=new 子类类型();
- 适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
向上转型
父类引用指向子类对象就是向上转型
向下转型
格式:子类型 对象名 = (子类型)父类引用;