多态的概述
什么是多态?同类型的对象,执行同一个行为,会表现出不同的行为特征。
多态的形式
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
多态中成员访问特点
方法调用:编译看左边,运行看右边。
变量调用:编译看左边,运行也看左边。(多态侧重行为多态)
多态的前提
有继承/实现关系;有父类引用指向子类对象;有方法重写。
多态的好处
1、在多态形式下,右边对象可以实现解耦合,便于扩展和维护。例如下面的代码中对象和后续代码无关。
Animal a = new Dog();
a.run(); // 后续业务行为随对象而变,后续代码无需修改
2、定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。
多态下引用数据类型的类型转换
自动类型转换(从子到父):
子类对象赋值给父类类型的变量指向。
强制类型转换(从父到子)
从父到子必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量。
作用:可以解决多态下不能使用子类的独有功能,即可以实现调用子类独有的功能。
有继承关系/实现的2个类型就可以进行强制转换,编译无问题。
注意: 运行时,如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException。
Animal t = new Tortoise();
Dog d = (Dog)t; // 出现异常 ClassCastException
Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换:
变量名 instanceof 类型
判断关键字左边的变量指向的对象的真实类型,
是否是右边的类型或者是其子类类型,
是则返回true,那么可以转换,
否则返回false,那么不可以转。
多态的综合案例
需求
使用面向对象编程模拟:设计一个电脑对象,可以安装2个USB设备
鼠标:被安装时可以完成接入、调用点击功能、拔出功能。
键盘:被安装时可以完成接入、调用打字功能、拔出功能。
分析
定义一个USB的接口(申明USB设备的规范必须是:可以接入和拔出)。
提供2个USB实现类代表鼠标和键盘,让其实现USB接口,并分别定义独有功能。
创建电脑对象,创建2个USB实现类对象,分别安装到电脑中并触发功能的执行。
代码
public interface USB {void connect();void unconnect();
}
/**实现类(子类)*/
public class KeyBoard implements USB{private String name;public KeyBoard(String name) {this.name = name;}@Overridepublic void connect() {System.out.println(name + "成功的接入了设备了~~~");}@Overridepublic void unconnect() {System.out.println(name + "成功的从设备弹出了~~~");}/**独有功能*/public void keyDown(){System.out.println(name + "写下了:老铁,6666,下次再来哦,老弟~~~~");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
/**实现类(子类)*/
public class Mouse implements USB{private String name;public Mouse(String name) {this.name = name;}@Overridepublic void connect() {System.out.println(name + "成功的接入了设备了~~~");}@Overridepublic void unconnect() {System.out.println(name + "成功的从设备弹出了~~~");}/**独有功能*/public void click(){System.out.println(name + "双击点亮小红心~~~~");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
/**目标:USB设备模拟1、定义USB接口:接入 拔出2、定义2个USB的实现类:鼠标、键盘。3、创建一个电脑对象,创建USB设备对象,安装启动。*/
public class Test {public static void main(String[] args) {// a、创建电脑对象Computer c = new Computer();// b、创建USB设备对象USB u = new Mouse("罗技鼠标");c.installUSB(u);USB k = new KeyBoard("双飞燕键盘");c.installUSB(k);}}