Как работает наследование Java

160
23 октября 2019, 23:50

Не могу понять почему не работает базовый метод. Создал абстрактный класс 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);
    }
}    
Answer 1

Нет, так сделать нельзя. Потому что наследуемый метод не знает ничего о подкласса. Поэтому нужно перекрыть метод toString() в подкласса и пользоваться полиморфизмом.

Сделать та, чтобы можно было пользоваться своим подклассом, ну это вроде что-то объясняет выше сказанное. Но, помимо этого желательно было бы наследовать не только метод toString(), но и его поля, тогда не нужно будет их дублировать в подкласса.

READ ALSO
Помощь с Java Servlets Jsp

Помощь с Java Servlets Jsp

я новичок, ещё не разобрался с сервлетамиВ общем, на странице index

114
Gulp Watch не следит за файлами

Gulp Watch не следит за файлами

При старте gulp watch выдает :

135
Как сделать эффект такого треуголника в секции?

Как сделать эффект такого треуголника в секции?

Как сделать эффект такого треуголника в секции?

121