Как инициализировать наследуемое 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 шт):
Это делается при помощи инициализатора объекта, который выполняется до любого конструктора. В инициализатор мы можем поместить код, общий для всех конструкторов
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;
}
Т.к. мы наследуется от этого класса, то у нас есть доступ к этой переменной и мы можем ею крутить как хотим, собственно и всё. Но второй вариант лично мне нравится меньше чем первый т.к. кто-то может изменить модификатор доступа и тогда придётся везде все исправлять и сеттер нам гарантируется инициализацию переменной. Собственно выбор за вами :)