2015-02-05 5 views
4

Вы не можете объявить интерфейс внутри блока, как показано нижеПочему вы не можете объявлять интерфейсы членов в локальном классе?

public void greetInEnglish() { 

     interface HelloThere { 
      public void greet(); 
     } 

     class EnglishHelloThere implements HelloThere { 
      public void greet() { 
       System.out.println("Hello " + name); 
      } 
     } 

     HelloThere myGreeting = new EnglishHelloThere(); 
     myGreeting.greet(); 
} 

В This Oracle tutorial я получил «Вы не можете объявить интерфейсы членов в локальном классе.» потому что «интерфейсы по своей сути являются статическими».

Я егер, чтобы понять это с более рациональной информацией, почему и как интерфейс по своей сути статичен?

и почему код выше не имеет смысла?

Заранее благодарим за эполмирование!

+0

Я думаю, что ваш вопрос дублируется. Пожалуйста, взгляните на это. http://stackoverflow.com/questions/512877/why-cant-i-define-a-static-method-in-a-java-interface –

+0

@DulithDeCozta Нет, это не дубликат, [Почему не может Я определяю статический метод в интерфейсе Java?] (Http://stackoverflow.com/questions/512877/why-cant-i-define-a-static-method-in-a-java-interface), это полностью другой вопрос –

ответ

0

Любые реализации могут изменять значение полей, если они не определены как окончательные. Затем они станут частью реализации. Интерфейс - это чистая спецификация без какой-либо реализации.

Если они являются статическими, то они принадлежат интерфейсу, а не объекту или типу времени выполнения объекта.

Интерфейс обеспечивает способ взаимодействия клиента с объектом. Если переменные не были общедоступными, клиенты не имели бы к ним доступа.

0

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

Вы не можете объявить интерфейс внутри блока

reference

+0

Если вы внимательно прочитали вопрос, Он дал код из [ссылки] (http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html), и он спрашивает, почему мы не может этого сделать. –

+0

Да, и это соответствующая часть последнего абзаца перед примером кода. – nrainer

2

Я Eagar, чтобы понять это с более рациональной информацией, почему и как интерфейс по своей сути являются статическими?

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

Почему они неявно статичны?

потому что именно так они его и спроектировали.

и почему код выше не имеет смысла?

из указанной выше причине,

Теперь позволяет сделать это просто:

Что означает статические - «не имеет отношения к конкретному экземпляру». Итак, предположим, статическое поле класса Foo - это поле, которое не относится к какому-либо экземпляру Foo, а принадлежит классу Foo.

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

Итак, если интерфейс не связан с каким-либо конкретным классом, очевидно, нельзя было связать его с экземпляром класса - правильно?

Я также предлагаю вам изучить Why static can't be local in Java?

+0

Я ценю ваши усилия, но все же у меня есть вопрос для этого предложения: «Если интерфейс не связан с каким-либо конкретным классом, очевидно, что нельзя связать его с экземпляром класса», то почему мы можем иметь интерфейс внутри класса? вот интерфейс с методом, поэтому не допускается. – Kevan

+0

Я дал эту ссылку для определенной цели. Поэтому позвольте мне объяснить, в чем была эта цель, если вы пройдете через нее, вы сможете понять, почему static не может быть локальным, поскольку это свойство класса. Все, что объявлено внутри класса, не является свойством экземпляра, у нас есть статические переменные, принадлежащие классу. Поскольку интерфейсы неявно статичны, поэтому размещение их внутри класса не делает их связанными с ** экземпляром ** класса. Надеюсь, вы поняли мое мнение. –

+0

', и вы не можете иметь не конечную статику во внутреннем классе' неточно, ** статический окончательный метод ** до сих пор не разрешен до JDK8, однако мы можем определить ** статические конечные переменные ** в локальном классе , – zhouji

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