2016-10-01 2 views
0

Я новичок в Java. Начал пару недель назад, опираясь на документацию оракула и этот сайт. Постепенно я хорошо понимаю основные концепции ООП.Вызов метода экземпляра интерфейса напрямую

Понятно, что метод экземпляра интерфейса становится методом экземпляра реализующего класса и, следовательно, может быть вызван через объект реализующего класса после его создания.

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

Просмотрев следующий фрагмент кода, который я читал в Интернете, я заметил, что метод iterator() вызывается через (set), который имеет только тип (Set interface) (т.е. set не является экземпляром любой класс, реализующий интерфейс Set).

Мой вопрос: возможно ли это?

С другой стороны, независимо от того, возможно ли это или нет, согласно документации oracle, метод iterator() классифицируется как «экземпляр» и «абстрактный» метод для интерфейса Set. Итак, как получилось, что это вызвано переменной «set», поскольку только методы по умолчанию и статический интерфейс имеют реализации?

public static void main(String args[]) { 

    HashMap<Integer, String> hmap = new HashMap<Integer, String>(); 

    hmap.put(12, "Chaitanya"); 
    hmap.put(2, "Rahul"); 

    /* Display content using Iterator*/ 
    Set set = hmap.entrySet(); 
    Iterator iterator = set.iterator(); 
    while(iterator.hasNext()) { 
    Map.Entry mentry = (Map.Entry)iterator.next(); 
    System.out.print("key is: "+ mentry.getKey() + " & Value is: "); 
    System.out.println(mentry.getValue()); 

ответ

-1

Вот как прочитать:

Set set = hmap.entrySet(); 
Iterator iterator = set.iterator(); 

hmap.entrySetвозвращает объект в set переменную, которая реализует Интерфейс Set. Это означает, что set реализует все методы, объявленные в интерфейсе Set. Поэтому вполне нормально называть метод iterator() объектом set, так как он является одним из методов интерфейса Set.

setявляется Н. объект, что реализует интерфейс Set. Это не интерфейс. Единственный интерфейс здесь - Set.

+0

«set» - это _объект_, который _implements_ [...] «Неверное утверждение - особенно для новичков. Переменная _is not_ - объект. Это просто _отчет одного. Тип переменной имеет два значения: 1) Он ограничивает тип времени выполнения объекта. 2) Он ограничивает методы, которые вы можете вызвать на него. – Seelenvirtuose

+0

Еще одна странная формулировка: «' hmap.entrySet' возвращает _объект_ в переменную 'set' [...]". Он не возвращает _into_ переменную. Вызов 'hmap.entrySet()' возвращает ссылку на объект (который является 'Set'), и эта ссылка _assigned_ для переменной. – Seelenvirtuose

+0

Ссылки слишком рано, когда вы пытаетесь понять разницу между классами и интерфейсами. Вы верны в описании типа переменной, но описание типов с точки зрения ограничений также немного сложно в данный момент, не так ли? –

0

Да, это возможно.

Комплект поставки; Здесь set является только ссылочной переменной.

Если мы интерфейс скажет, 'interface1', то следующий будет не допускаются:

interface1 объекта = нового Интерфейс1();

Но если Class1 реализует interface1, то

interface1 реф = новый Class1() и

Class1 реф = новый Class1(),

как выше 'реф', могут быть использованы.

Кроме того, вы должны знать, что, всех методов интерфейса являются общедоступными и абстрактными по умолчанию и должны быть реализованы все абстрактные методы .

Надеюсь, это ответит на ваш вопрос.

+0

Не могли бы вы немного подробнее остановиться на вашем последнем абзаце. Я знаю, что начиная с SE8, интерфейс по умолчанию и статические методы имеют реализации (не абстрактные). Возвращаясь к приведенному выше методу, метод iterator() работает хорошо, а не переопределяется. –

Смежные вопросы