Java基础:电脑USB接口案例、多态性、向上/下转型

USB接口案例图示下面为一个电脑类(class)。除了自身开关机,电脑的功能在于使用各种设备。但是作为电脑来说,只需要提供一个标准的USB母口,那么任何USB公口都可以在电脑上使用。于是定义了一个“使用设备”方法,传入参数为usb类型。

public class Computer {
    public void powerOn() {
        System.out.println("电脑开机");
    }

    public void powerOff() {
        System.out.println("电脑关机");
    }

    // 对于基本的USB设备是否工作,具体什么设备我不管,使用接口作为方法的参数
    public void useDevice(USB usb) {
        usb.plugIn();  // 插入设备

        // 而对于设备的特有功能,还是得寻找特定USB设备去完成
        if (usb instanceof Mouse) { // 先进行判断
            Mouse mouse = (Mouse) usb; // 然后向下转型
            mouse.click(); // 使用向下转型后的Mouse类对象mouse的特有方法
        } else if (usb instanceof Keyboard) {
            Keyboard keyboard = (Keyboard) usb;
            keyboard.type();
        }

        usb.pullOut(); // 拔出设备
    }
}

下面是一个USB接口(interface),建立电脑类与各种设备类之间的关联。

public interface USB {

    void plugIn();
    
    void pullOut();
}

// public abstract已经被省略

下面是鼠标类(class),鼠标类作为一种具体设备,对接口中的所有抽象方法(插入、拔出)进行了覆盖。除了所有USB设备都具有的插入、拔出的动作(接口的意义),鼠标还有特有的点击动作。

// 鼠标就是一种USB设备
public class Mouse implements USB {

    @Override
    public void plugIn() {
        System.out.println("鼠标开始工作");
    }

    @Override
    public void pullOut() {
        System.out.println("鼠标停止工作");
    }

    public void click() {
        System.out.println("鼠标特有功能:鼠标点击");
    }
}

下面的键盘类(class)也是如此。

// 键盘也是一种USB设备
public class Keyboard implements USB {

    @Override
    public void plugIn() {
        System.out.println("键盘开始工作");
    }

    @Override
    public void pullOut() {
        System.out.println("键盘停止工作");
    }

    public void type() {
        System.out.println("键盘特有功能:键盘输入");
    }
}

下面是程序的入口,computer.useDevice()中直接传入接口类型,或者传入实现类对象都是正确的。

public class Demo {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.powerOn(); // 开机

        USB usbMouse = new Mouse(); // 多态写法,左父右子,向上转型
		// 同一操作作用于不同对象,可以有不同解释,产生不同执行结果,这就是多态性
		// 简单的说:就是用基类的引用指向子类的对象。
		// 多态除了代码复用性,还可以解决项目中紧偶合的问题,提高程序的可扩展性
        computer.useDevice(usbMouse); // 传递进去的参数为USB类型

        Keyboard keyboard = new Keyboard();
        computer.useDevice(keyboard);
        // 方法参数要求是USB类型,可是传递进去了一个实现类对象keyboard
        // 没有使用多态写法,却也能正确传参,Why?因为也发生了向上转型
        computer.powerOff(); // 关机

        System.out.println("=========下面举一个例子=========");
        method(10.0); // double传入给double,没问题
        method(20); // int传入给double,基本类型发生了自动类型转换,也没问题

        // 键盘的情况更类似于下面两句,实现类keyboard向上转型为接口类型
        int a = 30;
        method(a);
    }

    public static void method(double num) {
        System.out.println(num);
    }
}

/*
电脑开机
鼠标开始工作
鼠标特有功能:鼠标点击
鼠标停止工作
键盘开始工作
键盘特有功能:键盘输入
键盘停止工作
电脑关机
=========下面举一个例子=========
10.0
20.0
30.0
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值