2015-08-04 2 views
-5

Я просто хочу знать, почему мы инициализируем объект родительского класса и создаем его с помощью дочернего класса вместо прямого экземпляра объекта дочернего класса.Java ArrayList-экземпляр

Пример:

List<String> sampleList=new ArrayList<String>(); 

И не

ArrayList<String> sampleList=new ArrayList<String>(); 
+2

https://en.wikipedia.org/wiki/Liskov_substitution_principle – David

+0

Вы можете использовать google, stackoverflow и многое другое, чтобы получить ответ –

ответ

4

Say создать метод, который делает что-то с ArrayList:

public int sum(ArrayList<Integer> list){ 
    int sum = 0; 
    for(Integer x : list){ 
     sum += x; 
    } 
    return sum; 
} 

Это будет работать хорошо сейчас, и кто-нибудь с ArrayList может назвать это. Но как насчет людей с LinkedList? Им не повезло!

Но почему я должен их исключать? Моя функция фактически не использует ничего конкретного для ArrayList - я фактически не уход или необходимо знать какой тип List функция дается. Так почему бы не сделать это как можно более общим, так что любой, у кого есть List, может вызвать мою функцию?

public int sum(List<Integer> list){ 
    int sum = 0; 
    for(Integer x : list){ 
     sum += x; 
    } 
    return sum; 
} 

Точно так же, почему я должен объявить переменную как ArrayList, если я на самом деле не волнует, какой тип List это? Что делать, если я хочу изменить эту переменную на LinkedList? Если я объявлю его как List, это однострочное изменение. Но если я объявляю его ArrayList, то мне нужно изменить каждую ссылку на него. Это может стать очень раздражающим в крупных проектах, поэтому обычно лучше держать свои переменные как можно более общие.

+0

, даже лучше использовать 'Collection' вместо – nafas

1

Первый список - это интерфейс, а не класс. Во-вторых, это называется Polymorphism, полиморфизм является важной концепцией в объектно-ориентированном программировании.

Используемый кейс для использования ссылки на родительский класс (или интерфейс, реализуемый классом), - это если вы хотите использовать эту ссылку для итерации через разные дочерние классы этого родительского класса.

This Тема может быть интересна для вас.

1

Ваш вопрос неверен по крайней мере в следующих подсчетов:

  1. Мы не «инициализировать объект родительского класса» в List<String> sampleList части — что просто объявление типа.

  2. Вы не можете инициализировать объект перед его созданием.

  3. Фактически мы создаем экземпляр классы, а не объекты. Результатом создания экземпляра класса является объект.

  4. List не является «родительским классом», это интерфейс. Интерфейсы не могут быть инстанцированы/инициализированы вообще.

Если устранить все эти ошибки из вашего вопроса и перефразировать как «Почему мы объявляем переменные общий типа», то ответ, что делает код более читаемым и ремонтопригоден: таким образом вы обещаете вам не будет использовать никаких спецификаций ArrayList, но будет строго использовать его в качестве общего List. Это становится более важным при использовании в параметрах метода: это делает ваш метод более полезным, позволяя использовать его с любой реализацией . На самом деле это полиморфизм.