为什么要使用接口引用指向实现类的实例
作者:互联网
声明:资料来自网上,仅供自己学习,并修改和分享,如有侵权,请告知,定会及时删除,谢谢。
首先来看一段代码:
// 定义接口Print public interface Print { void func(); }
// 实现类A public class PrintA implements Print { @Override public void func() { System.out.println("this is A"); } }
// 实现类B public class PrintB implements Print { @Override public void func() { System.out.println("this is B"); } }
// main类 public class Main { public static void main(String[] args) { Print print; print = new PrintA(); print.func(); print = new PrintB(); print.func(); } } // 输出结果为: // this is A // this is B
代码中我们使用了Print类型的变量来保存PrintA的实例,我们为什么不像下面这样使用PrintA类型的变量来保存PrintA的实例呢?
PrintA printA = new PrintA();
这种写法其实是JAVA中多态特性的表现形式(简单来说就是:允许将子类类型的指针赋值给父类类型的指针)。
在本文的示例程序中,Print接口和PrintA类对外提供的方法是相同的,但在有些情况下,PrintA类中的方法可能比Print接口中要多。通过将对象保存在Print类型的变量中并使用该变量,可以明确地表明程序的意图,即“使用Print接口中的方法,而不是使用PrintA类中的方法”。
即使将实例保存在Print类型的变量中,如果该实例的实际类型是PrintA类型,则依然可以使用下面的类型转换来调用PrintA类中独有的方法。
((PrintA)print).funcFromPrintA();
当然如果该实例的实际类型不是PrintA类型,则会抛出类型转换异常。
这种写法也提高了代码的灵活性,便于二次开发。如果需要改动实例的类型,可以直接更换实例,不需要改动其他部分的代码。
标签:指向,接口,PrintA,print,实例,类型,Print,public 来源: https://www.cnblogs.com/sszs/p/14504762.html