Почему при выводе на экран переменная high равна 0? А метод `super.getValues()` все выводит нормально?
public class bolshoi extends dom {
public door oko = new door("зеленый", true);
private int high;
public bolshoi(String color, int number, int high) {
super(color, number);
setValue(color, number, high);
getValues();
}
public boolean havetablichka() {
boolean tablica = true;
return tablica;
}
public void setValue(String color, int number, int high) {
super.color = color;
super.number = number;
this.high = high = 2;
}
@Override
public String getValues() {
String ee = super.getValues() + ".высота: " + high + ". есть табличка: " + havetablichka();
return ee;
}
}
Ответы (1 шт):
Скорее всего, в конструкторе класса-предка dom также вызывается виртуальный метод getValues, соответственно, при создании экземпляра потомка bolshoi, например new bolshoi("белый", 10, 20), конструктор базового класса вызывает метод класса-потомка getValues до того, как полю high было присвоено значение 20, переданное в конструктор класса-потомка.
И тогда метод класса-потомка использует непроинициализированное значение поля high по умолчанию: даже если бы в коде это поле было бы проинициализировано ненулевым значением private int high = 300;, инициализация числом 300 состоялась бы только после выполнения конструктора базового класса.
Ещё одна ошибка в коде метода bolshoi::setValues -- потеря входного значения high, которое будет перезатёрто двойкой в строке this.high = high = 2;: сначала любому входному аргументу присвоится 2, и только потом в поле экземпляра this.high запишется результат правого присваивания.