一、多态的概念
1.多态介绍
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
多态性是对象多种表现形式的体现。
2.多态优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
3.多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
class Shape {
void draw() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
}
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
4.实例
父类 Animal:
public class Animal {
public String name = "动物名称";
public void run() {
System.out.println("动物可以跑~~");
}
}
子类 Dog:
public class Dog extends Animal {
public String name = "狗名称";
@Override
public void run() {
System.out.println("狗跑的非常快~~~~");
}
public void eat(){
System.out.println("狗吃狗粮----");
}
}
子类 Tortoise :
public class Tortoise extends Animal {
public String name = "乌龟名称";
@Override
public void run() {
System.out.println("乌龟跑的非常慢~~~~");
}
public void eat(){
System.out.println("乌龟吃龟粮----");
}
}
测试类:
/**
* @ClassName: Test
* @Description: 多态(面向对象的三大特征:封装、继承、多态)
* 多态:去完成某个行为,当不同的对象去完成时会产生出不同的状态。
* 父类 对象名称 = new 子类构造器();
* 接口 对象名称 = new 实现类构造器();
* @author: Zh
* @date: 2024/4/20 13:37
*/
public class Test {
public static void main(String[] args) {
show(new Dog()); // 以 Dog 对象调用 show 方法
show(new Tortoise()); // 以 Tortoise 对象调用 show 方法
System.out.println("----格式:父类 对象名称 = new 子类构造器();----");
Animal a = new Dog();
a.run(); // 方法调用:编译看左,运行看右
System.out.println(a.name); // 属性调用:编译看左,运行也看左,动物名称
Animal a1 = new Tortoise();
a1.run();
System.out.println(a1.name); // 动物名称
}
public static void show(Animal a) {
a.run();
// 类型判断
if (a instanceof Tortoise) { // 乌龟做的事情
Tortoise c = (Tortoise)a;
c.eat();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.eat();
}
}
}
编译运行结果如下:
狗跑的非常快~~~~
狗吃狗粮----
乌龟跑的非常慢~~~~
乌龟吃龟粮----
----格式:父类 对象名称 = new 子类构造器();----
狗跑的非常快~~~~
动物名称
乌龟跑的非常慢~~~~
动物名称
二、多态的实现方式
1.方法1:重写(Override)
2.方法2:接口
- 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
- java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。