Я решаю некоторые головоломки Java и наткнулся на это:
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
При компиляции этого кода с javac 1.6.0_45
я получаю, как и ожидалось, эту ошибку:
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
Это из-за того, что компилятор генерирует конструктор по умолчанию для класса Inner2
с похожим кодом, что объясняет ошибку выше:
Inner2 () {
this.super();
}
И теперь это очевидно, потому что вы действительно не можете сделать это в Java 1.6.0_45, JLS 8.8.7.1 (как я могу догадаться):
Явный оператор вызова конструктора в теле конструктора может не ссылаются на какие-либо переменные экземпляра или методы экземпляра, объявленные в этот класс или любой суперкласс, или использовать это или супер в любом выражении; в противном случае возникает ошибка времени компиляции.
См. (принятый ответ в Нечетная ситуация для "не может ссылаться на это до того, как был создан конструктор супертипа" )
Но если я попытаюсь скомпилировать его с помощью javac 1.7.0_79
- это нормально!
И вот вопрос: Что изменилось в Java 1.7, что этот код теперь корректен?
Спасибо заранее!