Вложенные интерфейсы и внутренние классы Java

Почему вложенный интерфейс Java не может быть нестатическим? И почему внутренний класс не может содержать статические не окончательные члены?

Я наткнулся на вопросы, просматривая Гослинга, и пока не смог найти ответ.


person S..K    schedule 08.04.2011    source источник
comment
Вы прошли через Гослинга? Разве он не возражал против этого?   -  person Joachim Sauer    schedule 08.04.2011
comment
@Joachim Sauer instantrimshot.com   -  person Kevin D    schedule 08.04.2011


Ответы (2)


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

person Paŭlo Ebermann    schedule 08.04.2011
comment
Внутренний класс — это вложенный класс, который явно или неявно не объявлен статическим. [...] Интерфейсы-члены (§8.5) всегда неявно статические, поэтому они никогда не считаются внутренними классами. цитата из java.sun.com/docs/books/jls/ третье_издание/html/classes.html - person Zoltan Balazs; 08.04.2011
comment
Таким образом, нет такой вещи, как интерфейс внутреннего класса. - person Zoltan Balazs; 08.04.2011
comment
@Zoltan: Вопрос был почему таких вещей нет? - person Paŭlo Ebermann; 08.04.2011

Я не уверен, почему вы не можете иметь статические не окончательные члены во внутреннем классе, но поскольку статические члены не привязаны к какому-либо конкретному экземпляру объекта, не имеет значения, находится ли он во внутреннем или внешнем классе.

E.g.

class OuterClass {

  private static int staticMember;

  class InnerClass {

    void incStatic() {
      staticMember++;
    }

  }

}

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

person Will Whitaker    schedule 08.04.2011