Не могу понять почему не работает базовый метод.
Создал абстрактный класс 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()
, но и его поля, тогда не нужно будет их дублировать в подкласса.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты