Java中接口多态的实现方式以及创建接口实现类的对象的4种方式
接口多态的实现方式
语法格式:接口类型 接口名 = new 接口实现类的对象;
为了更加形象直观地理解,先举个例子,如下图:
打印机(Printer)、照相机(Camera)、投影仪(Projector)都有USB链接功能,这里有一个USB接口,让上述三个类分别实现USB接口,从而在与电脑(Computer)交互的过程中体现各自不同的交互功能。USB接口、各个实现类以及Computer类的组织架构图以及代码如下:
USB接口:
package example1;
2023/11/15 16:32
*/
public interface USB {
public abstract void start();//设备开始工作
public abstract void stop();//设备结束工作
}
Camera类:
package example1;
public class Camera implements USB{
public void start(){
System.out.println("照相机开始工作");
}
public void stop(){
System.out.println("照相机结束工作");
}
}
Printer类
package example1;
public class Printer implements USB{
public void start(){
System.out.println("打印机开始工作");
}
public void stop(){
System.out.println("打印机结束工作");
}
}
Projector类
package example1;
public class Projector implements USB{
public void start(){
System.out.println("投影仪开始工作");
}
public void stop(){
System.out.println("投影仪结束工作");
}
}
Computer类,其中提供了一个dataTransfer()方法,用于和不同的硬件设备进行交互。方法形参为USB类型的接口。
package example1;
public class Computer {
public void dataTransfer(USB usb){
System.out.println("设备链接正常");
usb.start();
System.out.println("设备传输数据细节…………");
usb.stop();
}
}
ComputerTest类,测试类:
package example1;
public class ComputerTest {
public static void main(String[] args) {
Computer computer = new Computer();
//1.创建接口实现类的对象
Camera camera = new Camera();
computer.dataTransfer(camera);
System.out.println("1.********************");
//2.创建接口实现类的匿名对象
computer.dataTransfer(new Printer());
System.out.println("2.********************");
//3.创建接口匿名实现类的对象
USB usb1 = new USB(){
@Override
public void start() {
System.out.println("匿名实现类的对象开始工作");
}
public void stop(){
System.out.println("匿名实现类的对象结束工作");
}
};
computer.dataTransfer(usb1);
System.out.println("3.********************");
//4.创建接口匿名实现类的匿名对象;
computer.dataTransfer(new USB(){
public void start(){
System.out.println("匿名实现类的匿名对象开始工作");
}
public void stop(){
System.out.println("匿名实现类的匿名对象结束工作");
}
});
}
}
运行结果如下:
上图右侧前两个彩色框内部的代码书写较为容易理解,现在对蓝色框(也就是创建接口匿名实现类的接口)内代码的书写做进一步详细说明:
蓝色框部分理解了,红色框部分就容易理解了。实际上,红框里面地代码实际上直接把接口匿名实现类的对象,放在了computer的dataTransfer()方法的形参里,这样减少了一步操作,也就是减少了USB usb1 = new USB(){………};这句代码的赋值操作,减少了中间变量usb1。
这个例子说明了接口多态的必要性:因为接口本身没有构造器,不能创建对象,只能由其实现类创建对象。同时,对于代码的使用者而言,dataTransfer()方法在具体实现的时候,可能是打印机、也可能是照相机、投影仪,不同的场景下调用的对象不同。但是代码编写者事先并不知道使用者想调用那个对象,于是在编写代码时,利用接口的多态性,将一个USB类型的接口放在dataTransfer()方法的形参中,形成了一定程度上的兼容和偷懒——我不管你调用哪个对象,只要是USB接口的实现类,你都可以创建相应类的对象并放进方法的参数里——这样就不必"一个类一个具体方法"的实现功能了,从而减少了代码的总量,也从某种程度上提高了开发的效率。