Java

Java не понимаю кое что

Вот есть главный класс Animal, у него есть метод eat
под него создается класс Dog, у него появляется ссылка на метод eat, то есть объект
Мы можем создать новые методы, которые не будут объектами, а можем переопределить родительский метод
Но тогда мы изменяем метод в родительском классе, но ведь после вызова метода родительского класса будет вызываться метод, который не был переопределен, но мы же его переопределили, почему?
Наследники класса Animal, например Dog, могут переопределить методы родительского класса Animal. Такие объекты можно использовать в программе в любом месте там, где требуется Animal, но вызываться будут методы, определённые в классе наследнике. Это логично, потому что Dog является Animal, но в переменной с типом Animal хранится объект Dog, у которого и вызывается метод. Если я создам список ArrayList<Animal>, в котором хранится множество различных животных: Cat, Dog, Bird, и пройдусь по списку в цикле, то вызываться будут соответственно методы животных (переопределённые методы), а не методы класса Animal (кроме тех, которые не были переопределены), что не имело бы никакого смысла при использовании наследования. Так как наследование существует именно для того, чтобы я мог подменять объекты и логику объектов новыми объектами, при этом чтобы не сломалась программа. Один из принципов проектирования SOLID (конкретно буква L), говорит о том, что наследники некоего класса должны быть способны подменить объекты основного класса при наследовании.
Намазбек Салам Салам
Намазбек Салам Салам
85 933
Лучший ответ
Александр Дюжиков если переопределенный метод после выполнения инициализируется тогда я понял, если нет тогда не понял
Александр Дюжиков Наследование получается делает так чтобы типы данных не конфликтовали и все
то есть это и есть реализация полиморфизма
Игорь Ноздрин не тоже неверно....
если переопределить метод, то eat() все равно скопируется у класса Animal, и соответственно вызовется метод класса Animal, а не переопределенный класса Dog
Когда вы переопределяете метод в классе-потомке, то при вызове этого метода у объекта класса-потомка будет вызываться переопределенная версия метода, а не родительская. Это называется полиморфизмом, и он позволяет классам-потомкам изменять поведение унаследованных методов.

Если вы вызываете метод на объекте класса-потомка, то будет выполнена переопределенная версия этого метода из класса-потомка. Однако, если вы явно хотите вызвать родительскую версию метода внутри переопределенного метода класса-потомка, вы можете использовать ключевое слово `super`.

Например, если у вас есть класс `Animal` с методом `eat`, и класс `Dog` наследует от класса `Animal` и переопределяет метод `eat`, то при вызове метода `eat` у объекта класса `Dog`, будет выполнена версия метода `eat` из класса `Dog`. Если вы хотите вызвать родительскую версию метода `eat` внутри класса `Dog`, вы можете использовать ` super.eat ()`.
Вадим ________
Вадим ________
3 078
Александр Дюжиков Если действительно вызывается переопределенный метод в классе Dog, а не в родительском классе Animal, то метод по логике уже не будет являться объектом, если он не ссылается на родительский метод. Но это нелогично, потому что если Animal animal = new Dog и я вызову метод eat, то метод eat вообще не вызовется, потому что он уже не будет являться объектом, я все равно не допер