Почему я не могу ссылаться на метод экземпляра при явном вызове конструктора?
Кто-нибудь знает, почему вы можете ссылаться на метод 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;
}
}
Ответы
Ответ 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);