Почему при выводе на экран переменная high равна 0? А метод `super.getValues()` все выводит нормально?

Рейтинг: -1Ответов: 1Опубликовано: 01.08.2025
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 запишется результат правого присваивания.