下面为一个电脑类(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
*/