面向对象三大特征之三 —— 多态

一、多态的概述,多态的形式

1、什么是多态?

  • 同类型的对象,执行同一个行为,会表现出不同的行为特征。
    2、多态的常见形式
    image

3、多态中成员访问特点

  • 方法调用:编译看左边,运行看右边。
  • 变量调用:编译看左边,运行也看左边。(多态侧重行为多态)

4、多态的前提

  • 有继续/实现关系; * 有父类引用指向子类对象;

  • 有方法重写。

  • image

二、多态的好处

1、优势

  • 在多态形势下,右边对象可以实现解耦合,便于扩展和维护。

  • image

  • 定义方法的时候,使用父类型作为参数,该方法就可以接收这个父类的一切子类对象,体现出多态的扩展性与便利。

2、多态下会产生一个问题:

  • 多态下不能使用子类的独有功能

三、多态下引用数据类型的类型转换

1、自动类型转换(子——>父):

子类对象赋值给父类类型的变量指向。

2、强制类型转换(父——>子):

  • 此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量
  • 作用:可以解决多态下的劣势,可以调用子类独有的功能。
  • 注意:如果转换后的类型和对象真实类型不是同一种类型,那么转换的时候就会出现ClassCastException

image

3、Java建议强制转换前使用intanceof判断当前对象的真实类型,再进行强制转换。

  • image

  • image

  • image

四、多态的综合案例

  • image
1、创建一个USB接口
点击查看代码
public interface USB {
    //接入 拔出
    void connect();
    void unconnect();
}
2、分别创建键盘和鼠标类(属性,方法)继承USB接口。
  • 键盘
点击查看代码

/**
 实现类
 */
public class KeyBoard implements USB {
    private String name;

    public KeyBoard() {
    }

    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 Mouse implements USB {
    private String name;

    @Override
    public void connect() {
        System.out.println(name +"连接成功");
    }

    @Override
    public void unconnect() {
        System.out.println(name + "成功拔出");

    }

    /**
     独有功能
     */
    public void dbClick(){
        System.out.println(name + "双击点亮小红心");

    }
    public Mouse() {
    }

    public Mouse(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
3、创建电脑类
点击查看代码
public class Computer {
    private String name;

    public Computer(String name) {
        this.name = name;
    }

    public Computer() {
    }

    public void start(){
        System.out.println(name + "电脑开始启动");
    }

    /**
     提供安装USB设备的入口
     */
    public void installUSB(USB usb){
        //多态:usb 可能是鼠标 也可能是键盘
        usb.connect();

        //独有功能:先判断再强转
        if (usb instanceof KeyBoard){
            KeyBoard k = (KeyBoard) usb;
            k.KeyDown();
        }else if (usb instanceof Mouse){
            Mouse m = (Mouse) usb;
            m.dbClick();
        }
        usb.unconnect();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
4、创建Test3实现
点击查看代码
public class Test3 {
    public static void main(String[] args) {
        // 1、创建对象
        Computer c = new Computer("dell");
        c.start();

        //2、创建鼠标对象,键盘对象
         USB u1 = new Mouse("蓝牙鼠标");
         c.installUSB(u1);

        USB u2 = new KeyBoard("键盘");
        c.installUSB(u2);
    }
}
posted @ 2022-04-05 16:26  luckylily  阅读(120)  评论(0)    收藏  举报