2015-01-04 5 views
0

Рассмотрим следующий класс:Понимание внутреннего класса в Java

package test; 

public class Container { 
    public class Contained { 
     public void foo() { 
      System.out.println("printed"); 
     } 
    } 
} 

и Main.java:

package test; 

public class Main { 

    public static void main(String[] args){ 
     Container c = new Container(); 
    } 
} 

Итак, мы здесь создали экземпляр класса Container. Означает ли это, что мы также создали экземпляр внутреннего класса? Я думал, да, это так, потому что внутренний класс - это вложенный класс non-static. Но как мы можем получить доступ к экземпляру внутреннего класса? Можем ли мы создать экземпляр вне класса Container?

Было бы очень полезно, если бы вы предоставили некоторые ссылки на JLS.

ответ

4

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

OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 

Так что в вашем случае это будет

Container container = new Container(); 
Container.Contained containedClass = container.new Contained(); 

Это называется внутренний класс. Во внутреннем классе вы можете получить доступ к членам класса контейнера

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

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

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

2

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

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

Container cr = new Container(); 
Container.Contained cd = cr.new Contained(); 

Внутренние классы описаны в JLS 8.1.3.

+0

он должен быть cr.new Содержимым() не cr.new Container.Contained Не так ли? –

+0

@MSach Вы правы, моя ошибка. благодаря – Eran

Смежные вопросы