Не могу понять почему не работает базовый метод.
Создал абстрактный класс Rodent для задачи интерфейса. Метод toString должен во всех производных классах делать одинаковую работу - возвращать значение поля name.
В main я заполняю массив ссылок Rodent случайными производными классами после чего в цикле печатаю их в консоль. Согласно методу toString должно выводиться поле name которые переопределены в каждом производном классе. Но выводится только поле Rodent. Даже если создать ссылку сразу на подкласс, а не на базовый все равно выводит поле базового. Можно ли сделать так, чтобы наследуемый метод toString возвращал значение поля своего класса, а не производного?
import java.util.Random;
abstract class Rodent{
private String name = "Rodent";
abstract void eat();
abstract void run();
abstract void sleep();
public String toString(){return name;}
}
class Humster extends Rodent{
private String name = "Humster";
public void eat(){System.out.println("Humster.eat()");}
public void run(){System.out.println("Humster.run()");}
public void sleep(){System.out.println("Humster.sleep()");}
}
class Rat extends Rodent{
private String name = "Rat";
public void eat(){System.out.println("Rat.eat()");}
public void run(){System.out.println("Rat.run()");}
public void sleep(){System.out.println("Rat.sleep()");}
}
public class Z1 {
Random rand = new Random();
public Rodent getRodent(){
switch (rand.nextInt(2)){
default:
case 0: return new Humster();
case 1: return new Rat();
}
}
public static void main(String[] args) {
Z1 zz = new Z1();
Rodent[] rr = {zz.getRodent(),zz.getRodent(),zz.getRodent(),zz.getRodent(),zz.getRodent(),zz.getRodent(),zz.getRodent(),};
for(Rodent rt : rr){
System.out.println(rt);
}
Rat rrr = new Rat();
System.out.println("Test Rat " + rrr);
}
}
Нет, так сделать нельзя. Потому что наследуемый метод не знает ничего о подкласса. Поэтому нужно перекрыть метод toString() в подкласса и пользоваться полиморфизмом.
Сделать та, чтобы можно было пользоваться своим подклассом, ну это вроде что-то объясняет выше сказанное. Но, помимо этого желательно было бы наследовать не только метод toString(), но и его поля, тогда не нужно будет их дублировать в подкласса.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости