理解Java中的层次结构

理解Java中的层次结构,java,inheritance,Java,Inheritance,我对继承和对象创建非常困惑,我试图理解在下面的示例中完全构造了哪些对象 class example { public static void main (String[] args) { System.out.println("starting...") ; A localAinMain = new A() ; // object created B localBinMain = ne

我对继承和对象创建非常困惑,我试图理解在下面的示例中完全构造了哪些对象

class example
{
   public static void main (String[] args)
   {
      System.out.println("starting...") ;

      A  localAinMain = new A() ;                              // object created
      B  localBinMain = new B() ;                              // object created
      C  localCinMain = new C() ;                              // object created

      System.out.println("...finishing") ;

      return ;
   }
}

class A
{
   // class fields
   protected static int objectNo   =     0   ;
   private   static C   staticCinA = new C() ;                 // object created

   // instance fields
   public final int serialNo = ++objectNo ;

   public A () { System.out.println("\tA.A[" + serialNo + "] - ctor\n") ; }

   static      { System.out.println("\tA      - static initializer\n") ; }
}

class B extends A
{
   // class fields
   private static B staticBinB = new B() ;                     // object created

   // instance fields
   private A  instanceAinB = new A() ;                         // object created

   public B () { System.out.println("\tB.B[" + serialNo + "] - ctor\n") ; }

   static      { System.out.println("\tB      - static initializer\n") ; }
}

class C extends B
{
   // class fields
   private static A staticAinC = new A() ;                     // object created

   // instance fields
   private B  instanceBinC = new B() ;                         // object created

   public C () { System.out.println("\tC.C[" + serialNo + "] - ctor\n") ; }

   static      { System.out.println("\tC      - static initializer\n") ; }
}
当我运行这个程序时,我得到以下输出

starting...
    A.A[1] - ctor

    A.A[2] - ctor

    B.B[1] - ctor

    B      - static initializer

    A.A[3] - ctor

    C      - static initializer

    A.A[4] - ctor

    A.A[5] - ctor

    B.B[4] - ctor

    A.A[6] - ctor

    A.A[7] - ctor

    B.B[6] - ctor

    C.C[4] - ctor

    A      - static initializer

    A.A[8] - ctor

    A.A[9] - ctor

    A.A[10] - ctor

    B.B[9] - ctor

    A.A[11] - ctor

    A.A[12] - ctor

    B.B[11] - ctor

    A.A[13] - ctor

    A.A[14] - ctor

    B.B[13] - ctor

    C.C[11] - ctor

...finishing

我想知道是否有人可以解释像C.C[11]和A.A[11]这样的对象创建顺序将是“localCinMain”,但我不明白为什么会感谢任何帮助

当您调用子类的构造函数时,该构造函数中的第一个调用始终必须是对超级类的调用。如果没有显式地调用超类的构造函数,则会隐式地进行调用

因为对super的调用总是发生在其他调用之前,所以执行代码的顺序总是super,然后是subclass

显式调用超类的代码示例:

public class B extends A {
    public B() {
        super();
        //Code for constructing B.
    }
}
如果您试图将此调用放在其他代码之后,编译器会抱怨,因为这是非法的


这是否回答了您的问题?

当您调用子类的构造函数时,该构造函数中的第一个调用始终必须是对超级类的调用。如果没有显式地调用超类的构造函数,则会隐式地进行调用

因为对super的调用总是发生在其他调用之前,所以执行代码的顺序总是super,然后是subclass

显式调用超类的代码示例:

public class B extends A {
    public B() {
        super();
        //Code for constructing B.
    }
}
如果您试图将此调用放在其他代码之后,编译器会抱怨,因为这是非法的


这是否回答了您的问题?

当您调用子类的构造函数时,该构造函数中的第一个调用始终必须是对超级类的调用。如果没有显式地调用超类的构造函数,则会隐式地进行调用

因为对super的调用总是发生在其他调用之前,所以执行代码的顺序总是super,然后是subclass

显式调用超类的代码示例:

public class B extends A {
    public B() {
        super();
        //Code for constructing B.
    }
}
如果您试图将此调用放在其他代码之后,编译器会抱怨,因为这是非法的


这是否回答了您的问题?

当您调用子类的构造函数时,该构造函数中的第一个调用始终必须是对超级类的调用。如果没有显式地调用超类的构造函数,则会隐式地进行调用

因为对super的调用总是发生在其他调用之前,所以执行代码的顺序总是super,然后是subclass

显式调用超类的代码示例:

public class B extends A {
    public B() {
        super();
        //Code for constructing B.
    }
}
如果您试图将此调用放在其他代码之后,编译器会抱怨,因为这是非法的


这是否回答了您的问题?

在Java中,当一个类被实例化时,它的超类的默认构造函数会被系统地调用。遍历整个层次结构(转到对象类)。 这是官方记录的:


如果子类构造函数显式或隐式调用其超类的构造函数,您可能会认为会调用整个构造函数链,一直返回到对象的构造函数。事实上,情况就是这样。它被称为构造函数链接,当有一长串的类下降时,您需要注意它。

在Java中,当一个类被实例化时,它的超类的默认构造函数会被系统地调用。遍历整个层次结构(转到对象类)。 这是官方记录的:


如果子类构造函数显式或隐式调用其超类的构造函数,您可能会认为会调用整个构造函数链,一直返回到对象的构造函数。事实上,情况就是这样。它被称为构造函数链接,当有一长串的类下降时,您需要注意它。

在Java中,当一个类被实例化时,它的超类的默认构造函数会被系统地调用。遍历整个层次结构(转到对象类)。 这是官方记录的:


如果子类构造函数显式或隐式调用其超类的构造函数,您可能会认为会调用整个构造函数链,一直返回到对象的构造函数。事实上,情况就是这样。它被称为构造函数链接,当有一长串的类下降时,您需要注意它。

在Java中,当一个类被实例化时,它的超类的默认构造函数会被系统地调用。遍历整个层次结构(转到对象类)。 这是官方记录的:


如果子类构造函数显式或隐式调用其超类的构造函数,您可能会认为会调用整个构造函数链,一直返回到对象的构造函数。事实上,情况就是这样。它被称为构造函数链接,当存在一条长长的类下降线时,您需要注意它。

每个派生类构造函数在执行自身之前调用基类构造函数

为什么??构造函数的工作是正确初始化对象。派生类只能访问其成员,但继承基类的属性。调用基类构造函数可确保正确构造对象

在执行期间调用构造函数的顺序如下:,
一,。内存是为定义的变量分配的。
二,。初始化值在构造函数之外的变量(例如int a=10)将被初始化。
三,。调用构造函数。但是构造函数中的代码只有在基类构造函数被调用(隐式)后才会执行

现在让您开始了解输出

当程序在main中到达“A localAinMain=newa();”行时,会发生以下情况。
一,。类的对象的内存