Как инициализировать наследуемое private поле по умолчанию

Как сделать поле isFly класса Bird по умолчанию true, не используя конструктора (не смотрите на то, что его нет в коде) и до вызова какого либо метода?

class Animal {
    private boolean isFly;
    void setFly(boolean fly) {
        this.isFly = fly;
    }
    boolean isFly() {
        return isFly;
    }
}
class Bird extends Animal {
    
}

Ответы (2 шт):

Автор решения: Waden

Это делается при помощи инициализатора объекта, который выполняется до любого конструктора. В инициализатор мы можем поместить код, общий для всех конструкторов

class Bird extends Aniaml {
    // начало блока инициализатора 
    {
        setFly(true);
    }
    // конец блока инициализатора
}
→ Ссылка
Автор решения: Дмитрий Алексеенко

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

И это все в классе Animal посмотрим на твоём примере

public class Animal {
  private boolean fly = false;
  public void setFly(boolean flag) {
       fly = flag;
  } 
  public boolean isFly {
       return fly;
  }
}

Далее у тебя есть класс Птица Bird Варинат номер раз:

    public class Bird extends Animal {
     public Bird() {
      setFly(true);
     }
}

Варинат номер два:

Делаем перменную fly из класса Animal с модификатором доступа protected и получам след

public class Bird {
 fly = true;
}

Т.к. мы наследуется от этого класса, то у нас есть доступ к этой переменной и мы можем ею крутить как хотим, собственно и всё. Но второй вариант лично мне нравится меньше чем первый т.к. кто-то может изменить модификатор доступа и тогда придётся везде все исправлять и сеттер нам гарантируется инициализацию переменной. Собственно выбор за вами :)

→ Ссылка