假设我有这样的情况:
class Base{
public Base() {
System.out.println("Base");
}
}
class Derived extends Base{
public Derived(){
System.out.println("Devired");
}
}
class DeriDerived extends Derived{
public DeriDerived(){
System.out.println("DeriDevired");
}
}
我不清楚继承的工作方式,例如,如果我尝试:
Derived b = new DeriDerived();
和DeriDerived b1 = new DeriDerived();
,它们都产生相同的结果。对于第二种情况:
DeriDerived b1 = new DeriDerived();
我了解(可能是正确的,也许不是?),DeriDerived将调用其超类,即Derived,而Devired将再次调用其超类,即Base,因此最后我们结果将如下所示:Based / Devired / DeriDerived。但是对于第一种情况,我不了解如何获得与基于/ Devired / DeriDerived相同的结果
谁能帮我解释一下?
非常感谢!
最佳答案
在java中,保留对对象的引用的变量不会影响对象的创建。
在所有情况下,您都在调用DeriDerived
构造函数,但是可以按以下类型引用创建的对象:DeriDerived,Devired,Base,Object。
但是在每种情况下,您对方法的可见性都不同。
因此,当您创建DeriDerived的实例但被Devired引用时,您将只能访问Devired和Base类中的方法。您将不会看到DeriDerived类的方法,尽管这将是对同一对象-> DeriDerived的引用。