Почему this () и super () должны быть первым оператором в конструкторе?

Java требует, чтобы если вы вызывали this () или super () в конструкторе, это должен быть первый оператор. Зачем?

Например:

public class MyClass {
    public MyClass(int x) {}
}

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        int c = a + b;
        super(c);  // COMPILE ERROR
    }
}

Компилятор Sun говорит, что «вызов super должен быть первым оператором в конструкторе». Компилятор Eclipse говорит, что «вызов конструктора должен быть первым оператором в конструкторе».

Тем не менее, вы можете обойти это, переставив код немного:

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        super(a + b);  // OK
    }
}

Вот еще один пример:

public class MyClass {
    public MyClass(List list) {}
}

public class MySubClassA extends MyClass {
    public MySubClassA(Object item) {
        // Create a list that contains the item, and pass the list to super
        List list = new ArrayList();
        list.add(item);
        super(list);  // COMPILE ERROR
    }
}

public class MySubClassB extends MyClass {
    public MySubClassB(Object item) {
        // Create a list that contains the item, and pass the list to super
        super(Arrays.asList(new Object[] { item }));  // OK
    }
}

Так что, этоnot stopping you from executing logic до звонка в супер. Это просто мешает вам выполнить логику, которую вы не можете вписать в одно выражение.

Есть похожие правила для звонковthis(), Компилятор говорит, что «вызов this должен быть первым оператором в конструкторе».

Почему компилятор имеет эти ограничения? Можете ли вы привести пример кода, где, если бы у компилятора не было этого ограничения, что-то плохое могло случиться?

Ответы на вопрос(19)

Ваш ответ на вопрос