2010-12-30 2 views
3

hi Я узнаю о интерфейсах Java. Я прочитал в учебнике Java, что интерфейс является ссылочным типом. Скажем, я объявляю интерфейсТип интерфейса Java как параметры конструктора

public interface INT {  public void dosomething();  } 

и у меня есть 3 класса, класс A {}, B {} и C {}.

class A{} implements INT. 
class B{} extends A{} and implements INT. 
class C{} implement INT. 

, то у меня есть еще один класс D {}, который имеет конструктору

public class D{ 
    private INT a,b,c ; 
    public D(INT a1, INT b1 , INT c1) { 
     a = a1; 
     b = b1; 
     c = c1; 
    } 
    .... 
} 

, а затем в главной(), я создать экземпляр класса Д объект

D myobject = new D(new A(), new B(), new C()); 

Говорят, что объекты, которые не связаны иерархией классов, могут использоваться для взаимодействия друг с другом с использованием интерфейса. Таким образом, в вышеприведенном классе классы C и A не связаны, и теперь интерфейс позволяет им «разговаривать» друг с другом? я понимаю это правильно? что другие преимущества есть, чтобы объявить конструктор как тип интерфейса, а не фактического типа класса, в отличие от

private A a, B b, C c ; 
public D(A a1, B b1 , C c1) { 
    a=a1; b=b1;c=c1; 
} 

Это что-то делать с полиморфизмом? извините, это моя первая попытка OO, поэтому мне здесь не хватает понимания.

+0

Прочитайте о соглашениях об именах Java. INT - это имя константы. –

+0

Его просто пример. Соглашения об именах исключены – ghostdog74

ответ

6

Огромное преимущество использования типа интерфейса в методе (или конструктор) параметров является то, что другие программисты могут назвать его и передать в своих классах, которые реализуют интерфейс , Классы, о которых вы не знали и которые даже не существовали при написании метода/конструктора. Если вы используете конкретные классы, вызывающие должны использовать эти классы, подклассировать их или изменить свой код, все из которых ограничивают их гораздо больше, чем реализация интерфейса.

+0

спасибо за объяснение. – ghostdog74

3

Ваш код является абсолютно верным.

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

Эта вещь называется инкапсуляцией: скрытие деталей реализации извне класса. Это всегда хорошо.

О связи: они не могут общаться напрямую. Но вы можете вызывать метод dosomething для любого из переданных объектов, потому что все они реализуют один и тот же интерфейс. Итак, где-то внутри объекта D вы можете написать:

a1.dosomething(); // called the method of A 
b1.dosomething(); // called the method of B 
c1.dosomething(); // called the method of C 
+0

спасибо за объяснение. Кстати, это 'a.dosomething()' или 'a1.dosomething'? потому что a1 уже назначен частной переменной экземпляра a, я думал, что это должно быть 'a.dosomething()'. спасибо – ghostdog74

+0

да, это '' конечно. –

1

Непонятно, что вы подразумеваете под «классами C и A», и теперь интерфейс позволяет им «разговаривать» друг с другом », но ваш код выглядит правильно.

+0

спасибо, что ответили. Я имею в виду, что класс C не является подклассом A, а не B. – ghostdog74

1

Таким образом, в приведенном выше класс, класс С и А не связаны, и теперь интерфейс позволяет им «разговаривать» друг с другом?

Не совсем. Кажется, вы все правильно поняли, но эта часть расплывчата. Это не тот интерфейс, который позволяет им разговаривать друг с другом, он позволяет каждому говорить с ними единообразно, даже не зная, какие классы представляют конкретный интерфейс в конкретном случае.Конечно, «все» также включают в себя эти классы, поэтому они могут разговаривать друг с другом, поэтому вы не ошибаетесь, но это просто неуместно. В вашем случае интерфейс позволяет классу D разговаривать с классами A, B и C и, возможно, со многими другими реализациями интерфейса, о которых вы даже не можете знать.

Интерфейс определяет, что может сделать объект. Класс определяет, как он это делает. Он называется разделением реализации из интерфейса. Полиморфизм - это механизм, который позволяет это. Когда вы вызываете метод интерфейса и вызывается метод класса реализации, это полиморфизм.

+0

спасибо за объяснение – ghostdog74

1

В дополнение к отличному отклику @Michael Borgwardt. Я бы добавил, что по мере того, как вы программируете, вы найдете использование интерфейсов, которые не были очевидны при запуске. например Интерфейсы очень полезны в модульных тестах для создания макетных объектов.

Они также полезны, когда вы приходите, чтобы реорганизовать свой код, и вы знаете, что D нуждается только в методах в INT. Если у A, B, C есть другие методы, вы знаете, что можете изменять (или удалять) их без прямого воздействия на D.

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