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