目录
多态
概述
- 同类型的对象,执行同一个行为,会表现出不同的行为特征
- 常见形式:
父类 对象名称 = new 子类构造器()
a和b都是Animal类型的对象,执行run()方法表现不同的行为特征,其中Animal是父类,Dog和Tortoise是子类
接口 对象名称 = new 实现类构造器()
成员访问特点
- 方法调用:编译看左边,运行看右边
- 变量调用:编译看左边,运行也看左边(多态侧重行为)
用代码去理解
调用run方法时,编译看左是因为要先有父类Animal的run方法,子类才能去重写run再调用,运行看右也就是说看子类里的run方法,这样才可以表现出子类不同的特征
调用变量name时,因为多态是强调行为多态,所以调的name是父类Animal里的,编译看左,运行也看左
多态的前提:有继承/实现关系;有父类引用指向子类对象;有方法重写
多态的优势&劣势
优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
→
比如说当某一天,我觉得乌龟跑太慢了,代码效率太低,我新开发一个狗来把乌龟换掉,后续的业务会随着这个对象的改变而改变,其他代码无需修改
- 定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性和遍历
将子类对象,赋给父类类型的变量,调用时调的是父类run,但是运行时运行子类自己的,实现了多态
劣势
- 多态下不能使用子类独有的功能
因为类型是Animal父类类型,所以没法调用子类Dog独有行为/功能
多态下引用数据类型的类型转换
自动类型转换(从子到父)
子类对象赋值给父类类型的变量指向
强制类型转换(从父到子)
子类 对象变量 = (子类)父类类型变量
作用:可以解决多态下的劣势,可以实现调用子类的独有功能
注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候会出现ClassCastException
Java建议强转转换前先使用instanceof判断当前对象的真实类型,再进行转换
多态综合案例
这个案例结合了多态、接口、实现类等知识点,可以加深印象,深入理解语法!
需求:
- 设计一个电脑对象,可以安装2个USB设备
- 鼠标:被安装时可以完成接入、调用点击功能、拔出功能
- 键盘:被安装时可以完成接入、调用打字功能、拔出功能
分析:
- 定义一个USB接口,申明USB的规范是:可以接入和拔出(方法)
- 提供2个USB实现类代表鼠标和键盘,让其实现USB接口,并分别定义独有功能
- 创建电脑对象,创建2个USB实现类对象,分别安装到电脑中并触发功能执行
代码参考
public interface USB {//USB接口
void connect();//接入
void unconnect();//拔出
}
public class Mouse implements USB{//鼠标实现这个USB接口
private String name;
public Mouse(String name) {
this.name = name;
}
@Override
public void connect() {
System.out.println(name+"成功接入设备");
}
@Override
public 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;
}
}
public class KeyBoard implements USB{//键盘实现这个USB接口
private String name;
public KeyBoard(String name) {
this.name = name;
}
@Override
public void connect() {
System.out.println(name+"成功接入设备");
}
@Override
public void unconnect() {
System.out.println(name+"成功拔出设备");
}
//独有功能
public void keyDown(){
System.out.println(name+"打字");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Computer {
//提供一个安装入口:行为
public void installUSB(USB usb){
usb.connect();
//独有功能
if(usb instanceof Mouse){
Mouse m = (Mouse) usb;
m.click();//点击
}else if(usb instanceof KeyBoard){
KeyBoard k = (KeyBoard) usb;
k.keyDown();//打字
}
usb.unconnect();
}
}
public class Test {
public static void main(String[] args) {
//a.创建电脑对象
Computer c = new Computer();
//b.创建USB设备对象
USB u = new Mouse("鼠标1");
c.installUSB(u);
System.out.println("-------------------");
USB u2 = new KeyBoard("键盘1");
c.installUSB(u2);
}
}