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 }