Подтвердить что ты не робот

Почему я не могу ссылаться на метод экземпляра при явном вызове конструктора?

Кто-нибудь знает, почему вы можете ссылаться на метод static в первой строке конструктора, используя this() или super(), но не нестатический метод?

Рассмотрим следующее:

public class TestWorking{
    private A a = null;
    public TestWorking(A aParam){
       this.a = aParam;
    }

    public TestWorking(B bParam)
    {
        this(TestWorking.getAFromB(bParam));
    }

    //It works because its marked static.
    private static A getAFromB(B param){
        A a = new A();
        a.setName(param.getName());
        return a;
    }
}

И следующий Нерабочий пример:

public class TestNotWorking{
    private A a = null;
    public TestNotWorking(A aParam){
       this.a = aParam;
    }

    public TestNotWorking(B bParam)
    {
        this(this.getAFromB(bParam));
    }

    //This does not work. WHY???
    private A getAFromB(B param){
        A a = new A();
        a.setName(param.getName());
        return a;
    }
}
4b9b3361

Ответ 1

Нестатические методы - это методы экземпляра. Это доступно только в существующем экземпляре, и экземпляр еще не существует, когда вы находитесь в конструкторе (он все еще находится в разработке).

Почему это так? Поскольку методы экземпляра могут обращаться к экземплярам (не статическим) полям, которые могут иметь разные значения в разных экземплярах, поэтому не имеет смысла вызывать такой метод на чем-то еще, чем существующий завершенный экземпляр.

Ответ 2

См. Спецификация языка Java 8.8.7.1. Это означает, что

Явный оператор вызова конструктора в теле конструктора может не ссылаться на какие-либо переменные экземпляра или методы экземпляра или внутренние классы, объявленные в этом классе или любом суперклассе, или использовать this или super в любом выражении; в противном случае возникает ошибка времени компиляции.

Это потому, что вы не можете вызвать метод экземпляра до создания экземпляра. Кстати, в конструкторе можно позже вызвать метод экземпляра (хотя это и не решение для вас).

Ответ 3

Я думаю, что это потому, что конечные переменные экземпляра еще не установлены (так что у вас пока нет экземпляра), и метод экземпляра может получить доступ к нему. В то время как вся статическая инициализация была выполнена до вызова конструктора.

Greetz, GHAD

Ответ 4

потому что, когда вы вызываете этот или супер-конструктор, ваш объект еще не сконструирован. (ваш экземпляр еще не инициализирован полностью). поэтому вызов метода экземпляра не создает сцену.

Ответ 5

TestNotWorking не инициализируется в этой точке. Проблема заключается в следующем: первый конструктор (TestNotWorking (A aParam)) может вызвать super() (внутренне он всегда делает), то есть вы должны вызвать метод до того, как вызывается конструктор суперкласса. Это незаконно.

Ответ 6

Если метод нестатический, вы должны называть его объектом.

Во втором примере вам нужно создать объект класса TestNotWorking и вызвать getAFromB на этом объекте.

Что-то вроде:

object = new TestNotWorking();
object.getAFromB(bParam);