Переменные не являются полиморфными в Java.Поскольку вы повторно объявили x
внутри Son
, эта переменная на самом деле будет другой x
, чем переменная в Father
.Таким образом, в init
методе Son
вы инициализируете Son
x
, но не Father
x
.
С другой стороны, ваше утверждение System.out.println(this.x);
находится внутри класса Father
, поэтому оно знает только о Father
* x
.Поскольку вы больше не инициализируете эту переменную из-за переопределения метода init
, x
в Father
остается null
(по умолчанию) и, следовательно, будет печатать null
.
Вы можете исправитьпроблема, удалив public String x;
из класса Son
.Это сделает Father
x
единственным x
, устраняя проблему.
Однако, как правило, вы хотите сделать эту переменную private
вместо public
.Вы также никогда не должны вызывать не-1037 * метод в конструкторе. Может вносить только ошибки .В этом случае правильным способом инициализации будет иметь конструктор с параметром в Father
:
public class Father {
private String x;
protected Father(String x) {
this.x = x;
System.out.println(this);
System.out.println(this.x);
}
public Father() {
this("Father");
}
// Rest of father's code, without the init method
}
public class Son extends Father {
public Son() {
super("Son");
}
// Rest of son's code, without the init method
}