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

Может ли статический вложенный класс быть создан в Java?

Из Oracle Java учебники Я нашел этот текст:

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

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

Доступ к статическим вложенным классам осуществляется с помощью имени класса:

OuterClass.StaticNestedClass

Например, чтобы создать объект для статического вложенного класса, используйте этот синтаксис:

OuterClass.StaticNestedClass nestedObject =      новый OuterClass.StaticNestedClass();

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

Есть ли у вас идеи, что это значит?

4b9b3361

Ответ 1

Вы сбиваете с толку static с abstract, как говорит kihero, или вы путаете концепцию с классом, который имеет методы static (который является просто классом, который имеет статические методы).

Статический вложенный класс - это всего лишь вложенный класс, который не требует экземпляра его охватывающего класса. Если вы знакомы с С++, все классы на С++ являются "статическими" классами. В Java вложенные классы по умолчанию не статичны (этот нестатический сорт также называется "внутренним классом" ), что означает, что им нужен экземпляр их внешнего класса, который они отслеживают за кулисами в скрытом поле, но это позволяет внутренним классам ссылаться на поля связанного с ними класса.

public class Outer {

    public class Inner { }

    public static class StaticNested { }

    public void method () {
        // non-static methods can instantiate static and non-static nested classes
        Inner i = new Inner(); // 'this' is the implied enclosing instance
        StaticNested s = new StaticNested();
    }

    public static void staticMethod () {
        Inner i = new Inner(); // <-- ERROR! there no enclosing instance, so cant do this
        StaticNested s = new StaticNested(); // ok: no enclosing instance needed

        // but we can create an Inner if we have an Outer: 
        Outer o = new Outer();
        Inner oi = o.new Inner(); // ok: 'o' is the enclosing instance
    }

}

Множество других примеров в Как создать экземпляр нестационарного внутреннего класса в статическом методе

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

Ответ 2

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

Ответ 3

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