其他分享
首页 > 其他分享> > 为什么要使用接口引用指向实现类的实例

为什么要使用接口引用指向实现类的实例

作者:互联网

声明:资料来自网上,仅供自己学习,并修改和分享,如有侵权,请告知,定会及时删除,谢谢。

首先来看一段代码:

// 定义接口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