package cn.learn.Practice03;
public interface UsbInterface {
void open(); //打开usb
void close(); //关闭usb
}
package cn.learn.Practice03;
public class Keyboard implements UsbInterface {
@Override
public void open() {
System.out.println("打开键盘连接");
}
@Override
public void close() {
System.out.println("关闭键盘");
}
public void type(){
System.out.println("键盘输入文字");
}
}
package cn.learn.Practice03;
public class Mouse implements UsbInterface {
@Override
public void open() {
System.out.println("打开鼠标连接");
}
@Override
public void close() {
System.out.println("关闭鼠标");
}
public void click(){
System.out.println("鼠标点击");
}
}
package cn.learn.Practice03;
public class LapTop {
public void powerOn(){
System.out.println("笔记本开机");
}
public void powerOff(){
System.out.println("笔记本关机");
}
//电脑使用usb,接口作为参数列表
public void useDevice(UsbInterface usb){
usb.open(); //实际调用的是鼠标或者键盘的open方法
//如果传入的是Mouse,则将参数向下转型,进行点击
if(usb instanceof Mouse){
//参数转型
Mouse m = (Mouse) usb;
//进行点击
m.click();
}
//如果传入的是Keyboard,则将参数向下转型,进行点击
if(usb instanceof Keyboard){
//参数转型
Keyboard k = (Keyboard) usb;
//进行打字
k.type();
}
usb.close(); //关闭设备
}
}
1 package cn.learn.Practice03;
2
3 public class Enter {
4 public static void main(String[] args) {
5 //首先创建一个笔记本电脑
6 LapTop one = new LapTop();
7 one.powerOn();
8
9
10 //准备一个鼠标
11 Mouse mouse = new Mouse();
12
13 //mouse.open(); 接口也有该方法,重名,编译通过,运行在右子类优先
14 /*
15
16 ??正确写法,看似传入的是一个对象,实际是实现类,自动向上转型
17 eg:int a=10;method(a);参数列表是double
18 不恰当的可以把Mouse 看作 int
19 甚至可以这么写one.useDevice(new mouse()); -匿名对象生成
20 自动转型为Mouse实现类,传递给useDevice(UsbInterface usb);
21
22 */
23 //调用电脑使用鼠标
24 one.useDevice(mouse);//触发click方法
25
26 //另一种写法,准备一个键盘,向上转型
27 UsbInterface keyboard= new Keyboard();
28 //keyboard.open(); 接口也有该方法,重名,编译通过,运行在右子类优先
29 //((Keyboard) keyboard).type(); 不能使用自己的单独方法与上面对比
30 //调用电脑使用键盘
31 one.useDevice(keyboard);
32
33
34 one.powerOff();
35 }
36
37 }