Java

JAVA, объясните, пожалуйста, простыми словами

List list = new ArrayList();
ArrayList list = new ArrayList();
В чем принципиально различие?
Я знаю, что ArrayList имплементирует интерфейс List, но это заумно, что это значит на практике?
2 варик используй и не парься
Максим Земцов
Максим Земцов
21 434
Лучший ответ
Максим Земцов otvet.mail.ru/question/221056672
Восточный Братишка В том то и дело, что я хочу знать разницу
В первом случае для объекта list по умолчанию (без явного преобразования list к типу ArrayList) доступны только методы, определённые в интерфейсе List.

Во втором случае для объекта list доступны все методы ArrayList.
Еркебулан Мариям Алтаевы если я создам List list = new ArrayList();
то я буду спокойно использовать все методы доступные для ArrayList...
тебя на собеседовании об этом спросили или просто балду пинаешь?

а показанных кусках кода -- без разницы.
различия будут понятны только когда ты станешь включать это в свой код...
Принципиальное различие в объявлении list - в первом случае это объект интерфейса List. И если мы на минутку "развидим" инициализацию объектом класса ArrayList представив что ее нет, то можем ожидать инициализацию list объектом любого (повторяю, ЛЮБОГО) класса реализующего упомянутый интерфейс.
Зачем это нужно - ну а зачем нужен интерфейс в ООП? Затем чтобы декларировать свойства объектов, его реализующих. Для того чтобы точно знать: у реализации есть эти свойства, к ним можно обращаться, и они совместимы с другими реализациями (если все сделано правильно). Это позволяет избегать жестких зависимостей: если надо работать только с общими свойствами логической группы классов (а интерфейс как раз и описывает такую группу, по сути), то мы указываем "типом" входных данных интерфейс - и нам становится безразлично, какая конкретно реализация прилетит фактическими данными, работаем только с теми которые ожидаем. Может прилететь даже та реализация, класса которой не существовало когда мы объявляли интерфейс.
Азат Жонкабай Суть и мякотка интерфейсов в том что они позволяют абстрагироваться от индивидуальных свойств разных реализаций, работая с только с общеинтерфейсными свойствами, которые заранее декларированы.
На практике это означает что (например) старый код не нужно будет переписывать для добавления "поддержки" каждого нового класса - пока новые классы реализуют тот же самый старый интерфейс, код работающий с этим интерфейсом продолжит работать без изменений. Или (например) можем предоставить интерфейс другим разработчикам работающим параллельно, чтобы их пакеты "дружили" с нашими, и не приходилось каждое изменение классов согласовывать между собой.
Единственное отличие, которое может быть полезным: в пером случае переменной list можно присвоить ссылку на объект любого класса, который реализует интерфейс List (а не только класса ArrayList или его наследника). Во втором случае можно присвоить только объект класса ArrayList или класса, унаследованного от ArrayList.
Поскольку в примере не реализуется потенциальное преимущество первого варианта, никакого смысла в нём нет. О возможном недостатке первого варианта написал Андрей.
ArrayList это дочка List.
В первой строке ты создаешь из объекта суперкласса поведение объекта дочернего класса который унаследован от суперкласса.
А во втором случае ты создаешь просто объект конкретного класса.
Разницы в поведении не будет, так как здесь проявляется полиморфизм. Единственное что из первого объекта ты сможешь перевыделить память и сделать его совершенно с другими свойствами, одной из дочек List (если сам суперкласс не является абстрактным) или же сделать его непосредственно List, а во втором случае объект ArrayList может быть только объектом класса ArrayList
Нурсултан Каирбеков какая дочка?
Лист -- интерфейс... у него не может быть детей...