理解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();”行时,会发生以下情况。
一,。类的对象的内存