构造函数是如何执行的?

时间:2010-06-01 10:13:16

标签: java jvm initialization

我正在从演讲幻灯片中做一些修改,它说构造函数以下列方式执行:

  1. 如果构造函数以此开头,则递归执行指示的构造函数,然后转到步骤4.

  2. 调用显式或隐式指示的超类构造函数(除非此类为java.lang.Object)。

  3. 按照在此类中声明对象的顺序初始化对象的字段。

  4. 执行此构造函数的其余部分。

  5. 我不明白的是,构造函数永远不能“启动”,因为即使它没有形成类层次结构/关系,默认情况下也会插入super()。

    这如何符合上述说明?

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

我不认为你是对的,或者我不明白这个问题。来自Java Language Spec

  

如果构造函数体不以显式构造函数开头   调用和构造函数   声明不是原始的一部分   class Object,然后是构造函数   身体被隐含地假设了   编译器以超类开头   构造函数调用“super();”,an   调用它的构造函数   没有的直接超类   参数。

因为这样的构造函数可以从this(...)开始,它调用同一个类的另一个构造函数。只有当调用的构造函数不以this(...)或super(...)开头时,才会自动调用super()。

我要说的是,在构造一个对象之后,调用了super(...)(如果该类不是java.lang.Object)。

答案 2 :(得分:2)

这里使用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
    }
}

答案 3 :(得分:0)

构造函数体中的第一个语句应该是this或super,如果没有,那么defalt的编译器会保留一个super()关键字(没有参数)。 所以构造函数体以这种方式执行:

  1. 执行将基于this或super关键字,然后

  2. 它将执行所有IIB(作为自上而下的方法),然后

  3. 它将执行程序员保存的所有语句(如sop,initilization)

  4. 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