导图社区 13.多态
JavaScript之多态知识总结,这是同类的对象,执行同一个行为,会表现出不同的行为特征。本图总结了它的访问特点(多态侧重行为多态)、优势等内容。
编辑于2022-05-12 16:11:19多态
是什么?
同类的对象,执行同一个行为,会表现出不同的行为特征。
常见形式
例如:
访问特点(多态侧重行为多态)
1.方法调用:编译看左边,运行看右边。 (即:编译时看父类的方法,实际运行了子类的方法)
2.变量调用:编译看左边,运行也看左边。 (即:编译时看父类的变量,实际也是运行的父类的变量)
使用多态的前提:
有继承/实现关系;有父类引用指向子类对象;有方法重写。
优势
1.在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
2.定义方法的时候,使用父类型作为参数, 该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。
问题:
1.多态下不能使用子类的独有功能
解决方法:使用强制类型转换:详细请看多态下引用数据类型的类型转换
多态下引用数据类型的类型转换
1.自动类型转换(从子到父):子类对象赋值给父类类型的变量指向。
2.强制类型转换(从父到子)
1.此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量
作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
注意:如果转型后的类型和对象真实类型不是同一个类型, 那么在转换的时候就会出现ClassCastException(类型转换异常)
解决方法:java建议强转转换前使用instanceof判断当前对象的真实类型, 再进行强制转换
案例:
1.USB接口类
2.鼠标类
/** * 鼠标 */ public class Mouse implements USB{ private String name; public Mouse() { } public Mouse(String name) { this.name = name; } @Override public void comment() { System.out.println(name + "成功连接了电脑"); } /** * 独有功能 */ public void dbClick(){ System.out.println(name + "双击点亮"); } @Override public void uncomment() { System.out.println(name + "成功从电脑中拔出"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3.键盘类
/** * 实现类 键盘 */ public class KeyBoard implements USB{ private String name; public KeyBoard() { } public KeyBoard(String name) { this.name = name; } @Override public void comment() { System.out.println(name + "成功连接了电脑"); } /** * 独有功能 */ public void keyDown(){ System.out.println(name + "敲击了,来了,啊哈哈"); } @Override public void uncomment() { System.out.println(name + "成功从电脑中拔出"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
4.电脑类
public class Computer { private String name; public Computer() { } public Computer(String name) { this.name = name; } public void start(){ System.out.println(name + "开机了"); } /** * 提供安装USB设备的入口 */ public void installUSB(USB usb){ //多态 usb == 可能是鼠标,也可能是键盘 usb.comment(); //独有功能:先判断再强转 if (usb instanceof KeyBoard){ KeyBoard k = (KeyBoard) usb; k.keyDown(); }else if (usb instanceof Mouse){ Mouse m = (Mouse) usb; m.dbClick(); } usb.uncomment(); } public void setName(String name) { this.name = name; } public String getName() { return name; } }
5.测试类
/** * 目标:USB设备模拟 * 1.定义USB接口,接入,拔出 * 2.定义2个USB的实现类,鼠标,键盘 * 3.创建一个电脑对象,创建USB设备对象,安装启动 */ public class Test { public static void main(String[] args) { //a.创建电脑对象 Computer c = new Computer("外星人"); c.start(); //b.创建鼠标对象,键盘对象 USB u = new KeyBoard("芜湖"); c.installUSB(u); USB u2 = new Mouse("好鼠标"); c.installUSB(u2); } }
6.结果