2015-10-30 1 views
0

Я столкнулся с этим в java, я знаю его статический вложенный класс, но зачем создавать экземпляр «static». Разве не вся идея «статического» использовать его без экземпляра? Я понимаю концепцию внутренних классов, но почему (и, откровенно говоря, как это возможно) создать «экземпляр» «статического» члена вообще?Случай статического вложенного класса

Почему это:

1- OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); 
2- nestedObject.aNestedClassMethod(); 

и не так:

1- OuterClass outerInstance=new OuterClass(); 
2- outerInstance.StaticNestedClass.aNestedClassMethod(); 
+0

имя статическое здесь вводит в заблуждение –

+0

Статический класс ** не является ** членом. –

ответ

1

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

Например:

public class Outer { 
    public static class Inner { 
     /* Code here. */ 
    } 
} 

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

new Outer.Inner() 

Если внутренний класс не будет статичной, а также например:

public class Outer { 
    public class Inner { 
     /* Code here. */ 
    } 
} 

Затем вам нужно будет создать экземпляр Outer для доступа Внутренний:

new Outer().new Inner() 
0

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

Так что, если у меня есть:

public class EnclosingClass { 
    public static class InnerClass { 
    } 
} 

Тогда каждый может прийти вокруг и сделать:

EnclosingClass.InnerClass instance = new EnclosingClass.InnerClass(); 

См: точно так же, как класс верхнего уровня.

Это на самом деле относится и к внутреннему классу. Там несколько сложнее, но в основном идея состоит в том, что внутренний класс по-прежнему является его собственным классом, но он имеет (в основном скрытую) ссылку на экземпляр окружающего класса, который его создал. Я говорю «в основном», потому что можно получить доступ к этому экземпляру через EnclosingClass.this. Компилятор java также делает некоторые удобные сантехника для вас, так что someFieldInTheEnclosingClass становится EnclosingClass.this.someFieldInTheEnclosingClass. Но не позволяйте этому стенографию вас обмануть: внутренний класс - это отдельный класс, а его экземпляр - это отдельный отдельный экземпляр; они не отличаются от класса высшего уровня в этом отношении.

0

Спасибо всем, кто ответил и прокомментировал. Я, наконец, понял это. Думаю, ответ был прямо у меня на глазах.

Причина, по которой вызов статического статического класса статична, заключается в том, как он ссылается, а не на поведение класса. Поскольку нам не нужен и экземпляр OuterClass для создания экземпляра InnerClass, и мы просто используем имя OuterClass, а не его объект, чтобы создать экземпляр внутреннего класса.

Особая благодарность Sleiman Jneidi, который опубликовал первый комментарий, имя статическое здесь «является» вводящим в заблуждение.

1- OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();