多态
多态的概述 , 多态的形式
什么事多态?
- 同类型的对象 ,执行同一个行为 ,会表现出不同的行为特征
多态的常见形式
、
多态中成员访问特点
案例演示
动物类
public abstract class Animal {
public abstract void run();
public String name = "张三";
}
子类
public class Dog extends Animal{
public String name = "李四";
@Override
public void run() {
System.out.println("跑的贼快…………");
}
}
测试类
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
// 方法 : 编译看左边 ,运行看右边
animal.run();
// 变量 :编译看左边 ,运行也看左边
System.out.println(animal.name);
}
}
结果
跑的贼快…………
张三
多态的前提
-
有继承/实现关系
-
有父类引用指向子类对象
-
有方法冲写
多态的优势
在多态形势下 , 右边对象可以实现就和 ,便于扩展和维护
Animal animal = new Dog();
animal.run(); // 后续业务行为随对象而变 , 后续代码无需修改
定义方法的时候 , 使用父类型作为参数 , 发方法就可以接受这父类的一切子类对象 , 体现出多态得扩展性与便利
多态下会产生的一个问题
- 多态下不能使用子类的独有功能
多态下引用数据类型的类型转换
多态的案例
- 接口
public interface USB {
// 接入 拔出
void connect();
void unConnect();
}
- 鼠标类
public class Mouse implements USB{
private String name;
/**
* 鼠标独有的功能
*/
public void dbClick() {
System.out.println(name + "双击 666 , 一键三连啊");
}
public Mouse() {
}
public Mouse(String name) {
this.name = name;
}
@Override
public void connect() {
System.out.println(name + "成功插入………………");
}
@Override
public void unConnect() {
System.out.println(name + "成功拔出………………");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 键盘类
public class KeyBoard implements USB {
private String name;
/**
* 键盘特有的属性
*/
public void typing() {
System.out.println(name + "成功打字");
}
@Override
public void connect() {
System.out.println(name + "成功接入");
}
@Override
public void unConnect() {
System.out.println(name + "成功拔出");
}
public KeyBoard() {
}
public KeyBoard(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 电脑类
public class Computer {
private String name;
public void start() {
System.out.println(name + "电脑开机");
}
/**
* 电脑类 : 提供安装USB设备的入口
*/
public void install(USB usb) {
// 使用多态的手法 usb == 可能是鼠标 , 也可能是键盘
// usb的接入
usb.connect();
// 独有功能先判断再强转
if (usb instanceof KeyBoard) {
KeyBoard keyBoard = (KeyBoard) usb;
keyBoard.typing();
} else if (usb instanceof Mouse) {
Mouse mouse = (Mouse) usb;
mouse.dbClick();
}
// 拔出
usb.unConnect();
}
public Computer() {
}
public Computer(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 测试类
/**
* @author North
* @date 2022/10/21 11:36
*
* 目标 : USB设备模拟
* 1. 定义USB接口 :接入 , 拔出
* 2. 定义2个USB的实现类 : 鼠标 , 键盘
* 3. 创建一个电脑对象 , 创建USB设备对象 ,安装启动
*/
public class Test {
public static void main(String[] args) {
Computer computer = new Computer("拯救者");
computer.start();
// 创建鼠标对象
USB keyBoard = new KeyBoard("罗技");
computer.install(keyBoard);
System.out.println("-------------------------------");
computer.start();
USB mouse = new Mouse("罗技");
computer.install(mouse);
}
}
- 结果