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

声明一个名为b2type 的变量Base。如果引用为null或引用的实例Base或的子类,则可以为该变量分配引用Base

然后

new Child()

创建的新实例ChildChild是的子类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>有点偶然。”

一个类似的示例是确定方法应返回的类型-

通常,您只想声明您返回的是常规类型(或接口),即使实现知道返回的是哪种具体类型。这隐藏了实现细节,使您以后可以更改它们。

以上是 Base b2 = new Child()是什么?表示? 的全部内容, 来源链接: utcz.com/qa/406043.html

回到顶部