Base b2 = new Child()是什么?表示?
class Base { public void add() {
System.out.println("Base ADD");
}
void subtract() {
throw new UnsupportedOperationException("Not yet implemented");
}
}
class Child extends Base {
public void add(){
System.out.println("Child ADD");
}
public void subtract() {
System.out.println("Child Subtract");
}
}
class MainClass {
public static void main(String args[]) {
Base b1 = new Base();
Base b2 = new Child();
Child b3 = new Child();
b1.add();
b2.subtract();
b2.add();
b3.subtract();
}
}
我对上面的代码有些困惑。最让我困惑的是
Base b2 = new Child();
和
b2.subtract();
我了解的是在编译时,编译器会检查天气Base
类是否具有subtract()
方法,然后在运行时,由于对象的类型是多态性Child
。
问题是我们如何或在哪里使用这条线,即 Base b2 = new Child();
在什么情况下我们应该使用这个?请帮助,那太好了!
回答:
查看语句的两个部分:
Base b2
声明一个名为b2
type 的变量Base
。如果引用为null或引用的实例Base
或的子类,则可以为该变量分配引用Base
。
然后
new Child()
创建的新实例Child
。Child
是的子类Base
,因此您可以将构造函数返回的引用分配给b2
变量。
现在,即使实际值引用了执行时的实例,您也只能“查看” Base
through的成员。但是,从任何方法已被 覆盖
在将使用的时候,他们是所谓的重写版本......所以,当你打电话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>
有点偶然。”
一个类似的示例是确定方法应返回的类型-
通常,您只想声明您返回的是常规类型(或接口),即使实现知道返回的是哪种具体类型。这隐藏了实现细节,使您以后可以更改它们。
以上是 Base b2 = new Child()是什么?表示? 的全部内容, 来源链接: utcz.com/qa/406043.html