При определении 'Set set = new HashSet ()' устанавливается экземпляр интерфейса или класс Set? - PullRequest
4 голосов
/ 15 сентября 2010

В Java «Set» и «List» являются интерфейсами, производными от интерфейса «Collection». Если мы используем код:

import java.util.*;

public class SetExample{

    public stactic void main(String[] args){
      Set set = new HashSet();
      //do something .....
    }

}

Существует ли класс «Set» в «Collection» API, для которого мы создаем объект («set»)? или мы создаем экземпляр интерфейса 'Set'?

Я действительно в замешательстве .......: O

Ответы [ 5 ]

11 голосов
/ 15 сентября 2010

java.util.Set - это интерфейс, а не класс. Так

Set set = new HashSet();

создает объект, который является экземпляром HashSet, и присваивает ссылку на этот объект переменной, тип которой Set. Это работает, потому что HashSet class реализует Set интерфейс. С другой стороны:

Set set = new Set();

выдает ошибку компиляции, поскольку вы не можете создать экземпляр интерфейса.

Интерфейс Java по сути является контрактом между реализацией (классом) и вещами, которые его используют. В нем говорится, что такое имена и подписи методов соответствующего объекта, но ничего не говорится о состоянии объекта или о том, как работают его методы.

(Просто немного запутать ... Java также позволяет писать что-то вроде этого:

Set set = new Set() {
    // attributes and methods go here
};

Это не создает «экземпляр» Set интерфейса per se ..., потому что это не имеет смысла. Скорее, он объявляет и создает анонимный класс , который реализует Set интерфейс.)

4 голосов
/ 15 сентября 2010

Вот несколько указателей:

Вы также должны прочитать Effective Java от Джошуа Блоха , особенно пункт 52: «Ссылаться на объекты по их интерфейсам» (здесь есть небольшой фрагмент для просмотра здесь )

1 голос
/ 10 декабря 2013
Интерфейс

java.util.Set обеспечивает слабую связь с объектом java.util.HashSet.Таким образом, разработчик может использовать ссылку java.util.Set для другого объекта семейства интерфейсов java.util.Set.

0 голосов
/ 15 сентября 2010

В API вы получаете кучу интерфейсов, скрывающих реализацию. например Набор позволяет вам скрыть любую реализацию, для которой HashSet является одним из.

0 голосов
/ 15 сентября 2010

Ссылка set имеет тип java.util.Set, который является interface. Хотя на самом деле это указывает на объект типа java.util.HashSet. (Полиморфный)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...