0

Почему когда я пытаюсь у класса - наследника вызвать метод, которого нет в классе-родителе вылезает ошибка? При создании объекта нужно использовать полиморфизм.

public class Main{
    public static void main(String[] args) {
        Person man = new Man(); //polymorphism
        man.sayHello();         //hello
        man.doSomething();      //error
    }
}
class Person {
    void sayHello(){
        System.out.println("hello!");
    }
}
class Man extends  Person{
    void doSomething(){
        System.out.println("it is doing something");
    }
}
Roman C
  • 9,043
  • 4
  • 20
  • 28
Vitaly
  • 1
  • Потому что так и задумано....... чтобы использовать методы непосредственно наследника - надо будет кастануть – Алексей Шиманский Jun 21 '22 at 09:11
  • То есть никакого иного способа нет? Через интерфейс или абстракцию тоже? – Vitaly Jun 21 '22 at 09:14
  • Если метода нет в родителе то причём тут интерфейс или абстракция?)) – Алексей Шиманский Jun 21 '22 at 09:31
  • ну вдруг чудо произойдёт) – Vitaly Jun 21 '22 at 09:34
  • 3
    Все логично. Вы расширяете класс с помощью наследования. doSomething это поведение характерное именно Man, то есть и вызвать вы его можете только на объекте Man. Для аналогии представьте себе класс "фигура", и куча наследников (квадрат, окружность и т.д.) И допустим у класса окружность есть метод getRadius. Как вы будете вызывать его на ФИГУРЕ, а не на ОКРУЖНОСТИ? ведь не у каждой фигуры есть радиусе. Как такой метод должен работать на квадрате? – had0uken Jun 21 '22 at 09:42
  • @had0uken Вызывать можно свои методы и те, которые наследуются из класса родителя. Только для это надо пользоваться соответствующим типом. – Roman C Jun 22 '22 at 06:03
  • @Vitaly У класса-родителя может быть много наследников, а также те, которые могут добавляться в будущем. Поэтому знать о том, какой метод будет добавлен невозможно, поэтому пользоваться можно лишь тем что было до того. – Roman C Jun 22 '22 at 06:16

2 Answers2

0

Потому что в классе родителя нет этого метода. Ты создаешь переменную типа Person в которую кладешь объект Man. Person знает только унаследованные методы

Просто создай метод в Person

void doSomething(){
        System.out.println("AAAAAAAAAA");
    }

И посмотри тогда , что напечатает man.doSomething()

Roman C
  • 9,043
  • 4
  • 20
  • 28
0

Ошибка возникает по причине того что у класса-родителя Person нет метода doSomething()

man.doSomething();      //error    

Если непонятно как работает наследование, то попробуй объявить переменную типа класса-родителя.

Man man = new Man(); 

Для того чтобы работал полиморфизм, у обоих классов должен быть объявлен метод с одинаковой сигнатурой. В противном случае можно вызвать метод класса-родителя после приведения типа, но это не будет полиморфизмом.

Чтобы лучше понять что такое полиморфизм рекомендую почитать Как на практике применяется полиморфизм?.

Roman C
  • 9,043
  • 4
  • 20
  • 28