在Java中询问继承

时间:2017-04-13 10:03:57

标签: java inheritance

假设我的情况如下:

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

相同的结果

任何人都可以帮忙解释一下吗?

非常感谢你!

4 个答案:

答案 0 :(得分:1)

这两个对象都是deriderived的实例,因此它们的行为相似 他们只是共享相同的构造函数 但是如果你在类中有其他方法,你将只能访问derived和base中的方法(在第一个场景中),而在第二个场景中,你将能够访问父类中的所有方法。
不建议这样做,因为它会给你的代码带来一些歧义。

答案 1 :(得分:1)

在java中,保存对象引用的变量不会影响对象的创建。

在所有情况下,您都在调用DeriDerived构造函数,但是这样创建的对象可以通过以下类型引用:DeriDerived,Devired,Base,Object。

但在每种情况下,您都有不同的方法可见性。

因此,当您创建DeriDerived的实例但由Devired引用它时,您将只能访问Devired和Base类中的方法。你不会看到来自DeriDerived类的事件,虽然这将是对同一个对象的引用 - > DeriDerived。

答案 2 :(得分:0)

创建对象时

 Derived d=new DeriDerived()

内部默认构造函数的第一个语句是 super()

super关键字也可用于调用或调用父类构造函数。构造函数从下到上调用并从上到下执行。所以它的工作方式如下

  1. DeriDerived()构造函数以DeriDerived方式调用Derived()构造函数 构造函数的第一个语句是super(),它调用父构造函数,即 Derived()构造函数。

  2. Derived()构造函数调用Base()构造函数

  3. Base()构造函数调用对象类构造函数作为对象是父类。

  4. 但在以下层次结构中执行Base() - >衍生的() - > DeriDerived()

    调试此代码

    class Base{
    
        public Base() {
             super();
            System.out.println("Base");
        }
    }
    
    
    class Derived extends Base{
    
        public Derived(){
         super();
    
          System.out.println("Devired");
        }
    }
    
    
    class DeriDerived extends Derived{
        public DeriDerived(){
           super();
          System.out.println("DeriDevired");
        }
    }
    

答案 3 :(得分:0)

参见两个对象创建 派生b = new DeriDerived(); DeriDerived b1 = new DeriDerived();

你正在调用相同的引用,与引用调用有关,即使用b或b1,它们都创建相同的实例,这就是它们给出相同结果的原因。

如果您想要有所不同,那么在每个类中创建公共方法并尝试使用引用进行访问。

使用子类引用(即使用b1),您可以访问Derived类方法,但是使用超类引用(即使用b),您将无法访问子类(DeriDerived)类方法< / p>