Подтвердить что ты не робот

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

Я начал готовиться к экзамену OCJP7, и я нашел эту главу, которая кажется очень сложной.

Скажем, у меня есть этот код:

class Outer1{
    interface InnerInterface{
        String x = "test";
    }
    class InnerClass{
        String x = "test";
    }
}
class Outer2{
    static interface NestedInterface{
        String x = "test";
    }
    static class NestedClass{
        String x = "test";
    }
}
class Main{
    public static void main(String [] args){
        String s1 = Outer1.InnerInterface.x;
        String s2 = new Outer1().new InnerClass().x;
        String s3 = Outer2.NestedInterface.x;
        String s4 = new Outer2.NestedClass().x;
    }
}

Не могли бы вы рассказать мне, почему мы можем получить доступ к Outer1.InnerInterface.x и Outer2.NestedInterface.x таким же образом? По умолчанию внутренние интерфейсы статичны? Я пытаюсь сделать некоторые соединения, чтобы сделать их более ясными.

4b9b3361

Ответ 1

Из Учебник Oracle Java:

Вложенный класс является членом его охватывающего класса. Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам класса, даже если они объявлены частными. Статические вложенные классы не имеют доступ к другим членам охватывающего класса. Как член OuterClass, вложенный класс может быть объявлен закрытым, общедоступным, защищенный или закрытый пакет. (Напомним, что внешние классы могут быть объявленный открытый или закрытый пакет.)

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

Кроме того, в упражнении используются запутывающие имена для интерфейсов.
 Оба InnerClass и NestedClass представляют собой вложенные классы. Но только InnerClass является внутренним классом, так как "внутренний класс" означает "нестатический вложенный класс".
Аналогично можно ожидать, что InnerInterface будет "внутренним интерфейсом", что означает "нестатический вложенный интерфейс"; но такого не существует. Оба InnerInterface и NestedInterface представляют собой вложенные интерфейсы, и ни один из них не является внутренними интерфейсами.

Ответ 2

Да, вложенные интерфейсы неявно static. В разделе 8.5.1 JLS указано:

Пользовательский интерфейс неявно static (§9.1.1). Разрешено для объявления пользовательского интерфейса избыточно указывать модификатор static.

Из-за этого вы можете получить доступ к x через вложенный интерфейс таким же образом через внешние классы Outer1 и Outer2 - оба вложенных интерфейса, InnerInterface и NestedInterface являются static.

Ответ 3

Не могли бы вы рассказать мне, почему мы можем получить доступ к Outer1.InnerInterface.x и Outer2.NestedInterface.x таким же образом?

Потому что это оба поля static.

Из Спецификация языка Java, Глава 9. Интерфейсы, пункт 9.3 Объявления полей (константа):

Каждое объявление поля в теле интерфейса неявно public, static и final.


Внутренние интерфейсы по умолчанию статичны?

Да.

Из 8.1.3 Внутренние классы и экземпляры Enclosing:

Пользовательские интерфейсы (§8.5) неявно static, поэтому они никогда считаются внутренними классами.

Ответ 4

Вы правы. Ключевое слово static для вложенных интерфейсов не является необходимым и избыточным. Вложенный интерфейс всегда статичен.

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