2015-01-04 15 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(); 

這就是所謂的內部類。在內部類可以訪問容器類成員

要爲Static Nested Class和創建對象,請使用此語法:

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

這被稱爲靜態嵌套類。在Static Nested Class和您不能訪問容器類實例成員,但只有靜態成員

2

創建的Container一個實例不會創建Contained類的實例,因爲有可能的Contained許多許多情況下,用相同的實例相關聯的Container。您明確創建Contained的實例。

是的,你可以通過指定將與它相關的的Container實例創建外Container類的實例:

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

內部類中JLS 8.1.3描述。

+0

它應該是cr.new Contained()不是cr.new Container.Contained是不是? –

+0

@MSach你是對的,我的錯。謝謝 – Eran