接口是干爹(也当父类使用),继承是亲爹 ———— 所以都可以用来实现多态
image.png

这里创建的对象以多态(对象名的类型用父类,或者接口来接收)用继承的父类的方式创建,传入形参后:调用的方法是是构造器的方法USB u = new Keyboard(“双飞燕”);,调用的是键盘构造器;

image.png

  1. package com.itheima.d4_polymorphic_test;
  2. /**
  3. * 目标:USB设备模拟
  4. * 1.定义USB接口:接入 拔出
  5. * 2.定义2个USB的实现类:鼠标、键盘
  6. * 3.创建一个电脑对象,创建USB设备对象,安装启动
  7. */
  8. public class Test {
  9. public static void main(String[] args) {
  10. // a。创建电脑对象(像java中要什么东西,就创建该东西的对象)
  11. Computer c = new Computer("外星人");
  12. c.start();
  13. // b.创建鼠标对象,键盘对象
  14. // 这里创建的对象以多态(对象名的类型用父类,或者接口来接收)用继承的父类的方式创建
  15. USB u = new Keyboard("双飞燕");
  16. c.installUSB(u); // 由于该方法创建时接收的形参是:接口,所以可以用多态
  17. // installUSB里面有个形参.connect-- 将传入的形参(调用构造器的方法)
  18. USB u1 = new Mouse("Acer鼠标");
  19. c.installUSB(u1);
  20. }
  21. }
  1. package com.itheima.d4_polymorphic_test;
  2. /**
  3. * USB接口 == 规范
  4. */
  5. public interface USB {
  6. // 接口定义的方法都是抽象方法,变量都是常量
  7. // 接入 拔出
  8. void connect();
  9. void unconnect();
  10. }
// 键盘类

package com.itheima.d4_polymorphic_test;

/**
 * 实现类
 */
public class Keyboard implements USB{// 新建键盘类,实现接口
    private String name;

    public Keyboard() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "连接了电脑");
    }

    /**
     * 独有功能
     */
    public void keyDown(){
        System.out.println(name + "敲击了键盘");
    }

    @Override
    public void unconnect() {
        System.out.println(name + "成功从电脑中拔出了~");
    }

}


// 鼠标类

package com.itheima.d4_polymorphic_test;

/**
 * 实现类
 */
public class Mouse implements USB{ // 定义一个鼠标类实现USB功能
    private String name;

    public Mouse() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "连接了电脑");
    }

    /**
     * 独有功能
     */
    public void dbClick(){
        System.out.println(name + "双击小红心,一键三连");
    }

    @Override
    public void unconnect() {
        System.out.println(name + "成功从电脑中拔出了~");
    }
}

电脑类用来创建方法(该方法的形参是接口类形参用来实现多态)

package com.itheima.d4_polymorphic_test;

public class Computer {
    private String name;

    public Computer() {
    }

    public Computer(String name) {
        this.name = name;
    }
    public void start(){
        System.out.println("开机了");
    }

    /**
     * 提供安装USB设备的入口
     */
    public void installUSB(USB usb){ // 接口可以理解为父类(干爹)
        // 多态:usb == 可能是鼠标,也可能是键盘
        usb.connect(); // 调用接口的功能 // 后面判断引用类型强转
        //独有功能:先判断再强转
        if (usb instanceof Keyboard){// 判断usb接口是被哪个实现类继承
            Keyboard k = (Keyboard) usb;  // 如果是键盘类就将use接口类型(引用)转换为键盘类
            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;
    }
}