查看语句的两个部分:
base b2
声明一个名为
b2type 的变量
base。如果引用为null或引用的实例
base或的子类,则可以为该变量分配引用
base。
然后
new Child()
创建的新实例
Child。
Child是的子类
base,因此您可以将构造函数返回的引用分配给
b2变量。
现在,即使实际值引用了执行时的实例,您也只能“查看”
basethrough的成员。但是,从任何方法已被 覆盖
在将使用的时候,他们是所谓的重写版本......所以,当你打电话
b2``Child``base__
Child
b2.subtract();
JVM找到引用的对象的 实际 类型
b2,并使用该类的实现
subtract-在这种情况下,该方法将显示“ Child Subtract”。
编辑:您专门询问了在哪里可以使用这种东西,以及它如何帮助…
您可以随时使用它来声明更通用类型的变量(超类或接口),但可以为其分配一个值,该值恰好是该接口的子类或实现。再举一个例子:
List<String> strings = new ArrayList<String>();
以一般方式声明变量的主要优点是可以保持灵活性-
稍后可以将的使用从
ArrayList<T>改为其他实现
List<T>,并且代码仍然可以正常工作。您基本上是在说:“我只需要提供的成员和担保
List<T>-我正在使用的事实
ArrayList<T>有点偶然。”
一个类似的示例是确定方法应返回的类型-
通常,您只想声明您返回的是常规类型(或接口),即使实现知道返回的是哪种具体类型。这隐藏了实现细节,使您以后可以更改它们。



