Java 使用超类中的构造函数

Java 使用超类中的构造函数,java,inheritance,constructor,super,Java,Inheritance,Constructor,Super,Java不允许多重继承,这意味着一个类不能从两个没有共同点的类继承,这意味着它们不在同一继承路径上。然而,一个类可以从更多的类继承,如果这些类是该类的直接超类的超类。但是这个类间接继承了这些类,这意味着它看不到这些上层超类的任何东西,对吗?当考虑构造函数在构造函数中使用super时,我感到困惑。例如,如果我们有以下类别: public class A { public A() { .... } } public class B extends A { p

Java不允许多重继承,这意味着一个类不能从两个没有共同点的类继承,这意味着它们不在同一继承路径上。然而,一个类可以从更多的类继承,如果这些类是该类的直接超类的超类。但是这个类间接继承了这些类,这意味着它看不到这些上层超类的任何东西,对吗?当考虑构造函数在构造函数中使用super时,我感到困惑。例如,如果我们有以下类别:

public class A {
    public A() { 
      .... 
    }
}

public class B extends A {
    public B() {
      super();
      ....
    }
}

public class C extends B {
    public C() {
      super();
      ....
   }
}
类C的构造函数首先使用super调用类B的构造函数。当这种情况发生时,B的构造函数本身首先用super调用A的构造函数,但C的构造函数对A的构造函数一无所知,对吗?我的意思是,继承只来自直接超类——继承层次结构中第一个最近的类。这是我的问题-对于super,我们只指直接超类的构造函数,而不管继承层次结构中有多少其他类。 这不仅适用于构造函数,而且适用于任何方法和实例变量


正如你所说,C的构造函数调用B的构造函数,B的构造函数调用A的构造函数。可以在C对象上调用任何A方法,C对象可以在A中看到非私有字段


即使您在C中重写了A的方法foo,您也可以使用super.foo获得A版本,前提是B也不重写它。

正如您所说,C的构造函数调用B的构造函数,B的构造函数调用A的构造函数。可以在C对象上调用任何A方法,C对象可以在A中看到非私有字段

即使在C中重写A的方法foo,也可以使用super.foo获得A版本,前提是B不重写它。

您必须在直接基类中调用一些构造函数。这可能是

public class A {
     public A() { 
      .... 
     }
    public A(String foo) { 
      .... 
    }
}

public class B extends A {
    public B() {
        super();
        .. or ..
        super("ThisIsAB")
    }
}

public class C extends B {
    public C() {
      super();
      ....
   }
}
因此,对于构造函数,您无法避免构造中间基类,但可以选择使用哪个构造函数。如果只有no-args构造函数,则可以通过对super的隐式调用来为您处理。有了多个构造函数,您就有了更多的选择

super可以引用任何基类中的任何非私有变量或方法。因此,方法和变量在这方面与构造函数不同。

您必须在直接基类中调用一些构造函数。这可能是

public class A {
     public A() { 
      .... 
     }
    public A(String foo) { 
      .... 
    }
}

public class B extends A {
    public B() {
        super();
        .. or ..
        super("ThisIsAB")
    }
}

public class C extends B {
    public C() {
      super();
      ....
   }
}
因此,对于构造函数,您无法避免构造中间基类,但可以选择使用哪个构造函数。如果只有no-args构造函数,则可以通过对super的隐式调用来为您处理。有了多个构造函数,您就有了更多的选择


super可以引用任何基类中的任何非私有变量或方法。因此,方法和变量在这方面与构造函数不同。

调用所有父级的构造函数。事实上,C从深层了解A,因为B扩展了A。例如,如果类A包含方法foo,那么您可以从C调用foo

因此,从您的示例中,C从B调用构造函数,B从A调用构造函数。此外,A也从类对象扩展。因此类对象中的构造函数也被称为


此外,您不需要向super添加调用。如果没有调用父级的构造函数,则会隐式调用super。

将调用所有父级的构造函数。事实上,C从深层了解A,因为B扩展了A。例如,如果类A包含方法foo,那么您可以从C调用foo

因此,从您的示例中,C从B调用构造函数,B从A调用构造函数。此外,A也从类对象扩展。因此类对象中的构造函数也被称为


此外,您不需要向super添加调用。如果没有对父级构造函数的调用,super将被隐式调用。

据C所知,C中未覆盖的任何内容都将包含在B中,即使在A类的覆盖范围内,实现也可能在B中

public class A {
   public A() {
   }

   public void aMethod() {
   }
}

public class B extends A {
   public B() {
     super();
   }
}

public class C extends B {
   public C() {
     super();
   }

   public void doWork() {
     super.aMethod();
   }
}

因此,在本例中,A处理Method的实现,即使在C的构造函数中调用super直接调用B的构造函数,而不是A的构造函数。

据C所知,在C中未覆盖的任何内容都包含在B中,即使在B的覆盖下,类A可能是实现的地方

public class A {
   public A() {
   }

   public void aMethod() {
   }
}

public class B extends A {
   public B() {
     super();
   }
}

public class C extends B {
   public C() {
     super();
   }

   public void doWork() {
     super.aMethod();
   }
}
因此,在本例中,A处理Method的实现,即使在C的构造函数中调用super直接调用B的构造函数,而不是A的构造函数。

即使您可以避免调用中间构造函数,您也不会希望,因为这意味着中间类的未初始化部分可能会被最底层的派生类访问。造成可怕的后果

但我感觉到您正试图用自己的方式绕过Java来实现多重继承。这是一件坏事。相反,你可以做得很好 a-wise通过使用接口

class B extends A implements C {
    // ... implement C methods here
}
或者使用聚合

class B extends A {
    private C c;
}
即使可以避免调用中间构造函数,您也不会想这样做,因为这意味着您有未初始化的中间类片段,这些片段可能会被最底层的派生类访问。造成可怕的后果

但我感觉到您正试图用自己的方式绕过Java来实现多重继承。这是一件坏事。相反,您可以通过使用一个接口来实现Java智能

class B extends A implements C {
    // ... implement C methods here
}
或者使用聚合

class B extends A {
    private C c;
}

还是不确定你在问什么问题。问号可能会有帮助。仍然不确定你问的问题是什么。问号可能会有帮助。我从来没有这样做过,但我认为如果你不使用超级调用启动你的ctor,它会为你调用默认的无参数构造函数。我从来没有这样做过,但我认为如果你不使用超级调用启动你的ctor,它将为您调用默认的无参数构造函数。多重继承不一定是坏事,只是java不支持。在这样做的语言中,它允许一些很好的事情,比如mixin,在mixin中,您可以扩展类,将功能添加到自己的类中,而无需任何工作。例如,在ruby mixins中,多重继承并不一定是坏事——只是java不支持。在这样做的语言中,它允许一些很好的事情,比如mixin,在mixin中,您可以扩展类,将功能添加到自己的类中,而无需任何工作。红宝石混合物中的eg