jvm 如何执行构造函数?

pwuypxnk  于 2022-11-07  发布在  其他
关注(0)|答案(5)|浏览(108)

我对课堂上的幻灯片做了一些修改,它说构造函数是以下面的方式执行的:
1.如果构造函数以此开头,则递归执行指定的构造函数,然后转到步骤4。
1.调用显式或隐式指示的超类构造函数(除非该类是java.lang.Object)。
1.按照在此类中声明对象字段的顺序初始化这些字段。
1.执行此构造函数主体的其余部分。
我不明白的是,构造函数永远不能从这个“开始”,因为即使它没有形成类层次结构/关系,那么super()也是默认插入的。
这与上面的描述有什么关系?

8dtrkrch

8dtrkrch1#

构造函数(对于除java.lang.Object之外的每个类)必须以“super”或“super”开头()",以调用其超类的“构造函数”,或“this()",以调用同一个类的另一个构造函数。如果在构造函数中不包含这两个构造函数中的任何一个,则编译器将插入对super的调用().构造函数可以从调用同一个类中得另一个构造函数开始,只要最终调用类中得构造函数时调用超类构造函数即可.

pvcm50d1

pvcm50d12#

我不认为你是对的,或者我不理解这个问题。来自Java语言规范:
如果构造函数体不以显式构造函数调用开始,并且被声明的构造函数不是原始类Object的一部分,则编译器隐式地假定构造函数体以超类构造函数调用“super();“,调用其不带参数的直接超类的构造函数。
这样的构造函数可以以this(...)开头,它调用同一个类的另一个构造函数。只有当调用的构造函数不是以this(...)或super(...)开头时,才会自动调用super()。
我想说的是,在构造一个对象之后,super(...)已经被调用(如果类不是java.lang.Object)。

vxbzzdmp

vxbzzdmp3#

这里,使用this(...)的或多或少的实际例子

public class Car {

    private final int numberOfDoors;

    public Car(int doors) {
        numberOfDoors = doors;
    }

    public Car() {
        this(4);    // default is 4 doors, calls the constructor above
    }
}
s3fp2yjn

s3fp2yjn4#

构造函数体中的第一条语句应该是this或super,如果没有任何内容,则编译器默认保留super()关键字(不带参数)。因此构造函数体以如下方式执行:
1.执行将发生在this或super关键字的基础上,则
1.它将执行所有IIB(作为自上而下方法),然后
1.它将执行程序员保存的所有语句(如SOP、初始化)

Class A{
    A() {
        this(10);    //or super,....... execution statement 1
        // executing IIB's, execution statement 2
        System.out.println("from A()");   // execution statement 3
    }

    A(int i) {
        System.out.println("from A(int)");
    }        
    {
        System.out.println("from IIB-1");
    }

    public static void main(String[] args){
        A a = new A(); //calling constructor A()
        System.out.println("from main");
    }
    {
        System.out.println("from IIB-2");
    }
}

输出量:

from IIB-1
from IIB-2
from A(int)
from A()
from main
fbcarpbf

fbcarpbf5#

在Java中,当你用new示例化任何对象时,比如**C c = new C();**它委托其超类构造函数先创建它。

So in your case new C() --> Delegates to --> B() --> Delegates to A()
So execution flow is as below:

1) A() will Prints : 2
2) B() will calls  B(1 )  prints  3 and control return to B() constructor
3) B() will prints : 4
4) C() will prints : 6

I hope it is now clear

相关问题