假设我有这样的情况:

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的引用。

09-26 05:47