@P_Alexander
First head

Почему нет методов у потомков?

Я новичок и для кого-то вопрос может показаться слишком простым, но я все же решил его задать никак не решив его.
public class Figure {
    public String getName() {
        return "Figure";
    }
}


public class Line extends Figure {
    public Line(int a, int b){
        ...
    }
    public String getName() {
        return "Line";
    }
    public void move() {
        ...
    }
}


public class Rect extends Figure{
    public Rect(int a, int b){
        ...
    }
    public String getName() {
        return "Rect";
    }
    public void move() {
        ...
    }
    public void setPosition(int a, int b){
        ...
    }
}


public ArrayList<Figure> f = new ArrayList<>();
main(){
    f.add(new Line(1,2));
    f.add(new Rect(1,2));
    System.out.print(f.get(0).getName()) // почему-то печатает "Figure"
    Figure f1 = f.get(1);
    f1.move(); // этого метода в списке нет
}


Вопрос первый - почему не вызывается метод объекта нужный getName?
Вопрос второй - почему нет в списке методов которых нет в классе Figure?
но если создавать экземпляр класса Line и положить его в переменную типа Line то все работает.
И что нужно почитать для того что бы хранить экземпляры классов различных типов в одной переменной (с типом Object тоже не работает, не видно методов этих экземпляров)?
  • Вопрос задан
  • 248 просмотров
Решения вопроса 1
OLDRihard
@OLDRihard
Java Developer
Пора мне попрактиковаться в преподавательской деятельности:
Итак, рассмотрим пример. При объявлении переменной мы перед собой видим следующую структуру:
Figure f1 = new Rect(1,2);
Figure в этом выражении представляет из себя то, что можно записать в переменную f1, но кроме этого оно символизирует то, как мы воспринимаем эту переменную. Другими словами, что бы мы туда не записали, воспринимать мы будем ее как Figure и видеть методы присущие только этому классу. (Стоит заметит, пусть даже методы мы видим только от родительского класса, но если мы их переопределим, выполнятся будет именно новая версия).

Аналогичная ситуация и со списками. Какой класс ты поставишь в <>, так и будет восприниматься содержимое этого списка.

Если тебе нужно добраться до невидимых методов, можно сделать 2 вещи:
Line f2 = (Line)f.get(0);
Или ((Line)f.get(0)).move();

Но вот тут:
f.add(new Line(1,2));
System.out.print(f.get(0).getName()) // почему-то печатает "Figure"
Ты сударь что-то брешешь. Он должен должен и будет выводить 'Line'. И не надо говорить что у тебя не так. Проверяй, что туда записываешь и как переопределен у тебя этот метод.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Напиши @Override в потомках над методами которые переопределяешь. Для видимости метода которого нет в родителе нужно приводить тип типа
Line f1 = (Line) f.get(1); f1.move();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы