2013-08-17 4 views
17

От Java в Oracle tutorials Я нашел этот текст:Может ли статический вложенный класс быть создан в Java?

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

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

Статические вложенные классы обращаются, используя имя класса вшита:

OuterClass.StaticNestedClass

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

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

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

Вы не знаете, что это значит?

+4

Да, это возможно. Возможно, вы думаете о нестационарном внутреннем классе, и в этом случае вы можете создать его только через уже созданный экземпляр внешнего класса.Кроме того, если вы знакомы с C#, вы не можете создавать статический класс на этом языке. Этот оператор очищает его: «По сути, статический вложенный класс поведенчески является классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки». – sgbj

ответ

28

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

Статический вложенный класс - это всего лишь вложенный класс, для которого не требуется экземпляр его охватывающего класса. Если вы знакомы с C++, все классы в C++ являются «статическими» классами. В 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's 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 
    } 

} 

Много других примеров на How to instantiate non static inner class within a static method

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

+1

Спасибо, это отвечает на мой вопрос! – user1031431

+3

Просто прояснить терминологию. Java имеет вложенные классы - статические и нестатические. Нестатические вложенные классы называются внутренними классами. Нет ничего похожего на статические внутренние классы. – Swapnil

+0

@Swapnil Спасибо, что поймали это. «Статические вложенные классы», официально, для «статического» сорта. –

4

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

+4

Он также может вводить в заблуждение статические методы со статическими классами. – keyser

8

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

+1

извините, но этот ответ довольно запутанный – niceman

+2

Отличный ответ! Это единственный ответ, который на самом деле отвечает на вопрос. –