Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Объясните, что даёт создание объекта, но после знака равно использовать другой класс java?

Егор Гирко Ученик (234), на голосовании 10 месяцев назад
Я не знаю, как сформулировать правильно, и как гуглить. Вот обычно, при создании объекта пишется, например: Car car = new Car(); а можно написать Car car = new Vehicle(), или List list = new ArrayList() вместо ArrayList = new ArrayList. Всегда же было одинаково по обеим сторонам знака равенства, все было понятно. В чем различия таких записей?
Голосование за лучший ответ
Зеленая бяка Просветленный (41308) 11 месяцев назад
Если у тебя есть класс Animal в котором есть абстрактный метод makeSound() и есть классы наследники Cat, Dog которые переопределяют этот метод как Мяу и Гав, то ты, используя такую запись можешь единым образом вызывать этот метод
 List animals = new ArrayList<>();
alimals.add(new Cat());
animals.add(new Dog());
alimals.forEach(animal -> animal.makeSound());
//Мяу
//Гав
Это называется полиморфизм, полезная и постоянно используемая штука в программировании.
Jurijus Zaksas Искусственный Интеллект (445772) 11 месяцев назад
Если класс В наследуется от класса А, ты можешь сделать 2 вещи:
 B b = new B();
A a = new B();
Насколько я понимаю, тебе интересен именно второй вариант.
Так вот, он используется в тех случаях, когда тебе нужно работать с В как будто он А. Но не совсем.
Т. е. любое переопределенное поведение будет соответствовать В. Но во всем остальном он будет претворяться А.

А еще это может быть интерфейс. Если класс A реализует интерфейс I, то можно встретить такую запись:

 I i = new A(); 
Опять же, это значит, что ты хочешь работать с А через стандартный интерфейс, а реализация А тебя волнует мало.

Вот примерно так.
Катя Левкович Профи (731) 11 месяцев назад
Vehicle в вашем примере является "уточнением" класса Car. Car более абстрактное, широкое понятие, в то время как Vehicle - более конкретное.
На другом примере: есть класс Food и его классы-наследники: IceCream, Pizza, Cookie. Food - это нечто общее, категория, обобщение. А IceCream, Pizza и Cookie - уточнения. Со всеми этими тремя классами-наследниками мы можем работать одинаково, как с Food. И если у класса Food есть метод getCalories(), то его можно будет вызвать и у IceCream, Pizza и Cookie.
В коде это будет выглядеть так:
 Food iceCream = new IceCream();
int calories = iceCream.getCalories();
Но если у IceCream есть метод, который присущ только ему, а в Food его нету (например, метод getBallCount(), типа количество шариков в мороженом), тогда, чтобы использовать этот метод, придётся и слева написать тип IceCream. То есть:
 IceCream iceCream = new IceCream();
int ballCount = iceCream.getBallCount();
Если вы интересуетесь, зачем делать так, как в первом примере кода, то рекомендую вам познакомиться поближе с идеями ООП, это очень занимательно. Про его базовые идеи можно почитать тут
Похожие вопросы