2013-12-23 68 views
1

今天我瞭解到,您可以在分隔符(.或「點運算符」)旁邊使用new運算符。這讓我想知道Java是否隱式地對所有新運算符使用相同的技術。Java是否隱式地將構造函數(或對象)與new運算符一起使用?

以下語句創建一個新的「InnerClass對象」。它使用一個新的ParentClass對象,使用.new。但是,此語句中的第一個new運算符不在構造函數(或對象)的前面。那麼,Java是否在編譯時添加了一個?我試着明確地在這個語句中添加一個(Main()),但代碼不會編譯。

ParentClass.InnerClass ic = new ParentClass().new InnerClass(); 
+0

可能重複[在Java中有\'someObject.new \'做什麼?](http://stackoverflow.com/questions/15724676/what-does-someobject-new-do-in-java) – Mikhail

回答

3

形式

someObject.new InnerClass() 

僅用於inner classes。內部類的實例必須與其封閉類的實例關聯。通常,封閉實例是this,否定了對虛線符號的需要,但是當您想顯式創建與不同對象關聯的內部類的實例時,上述語法就是您使用的。

Java中的大多數類都不是內部類。不需要包含實例,因此Java在調用全部new之前並不隱式插入new Something()。 (如果有,它會那些之前插入new Something()它插入電話之前,和new Something(),你不能建造任何東西。)

1

外類和靜態內部類可以創建自己的擁有,沒有任何父母元素。非靜態內部類雖然需要成爲父元素的一部分。由於外部和靜態類不存在父元素的概念,因此不可能引用該父元素。

提供此表單以允許您在一個步驟中構建外部和內部對象,並只保留對內部對象的引用。我從來沒有發現太多用處,但知道它存在很方便。

1

我沒有看過這個內部,但我們先假設編譯器在編譯時添加一個對象來繼續新的操作。這意味着我們所有的班級都是另一班班級的內部班級。由於他們沒有在另一個班級內宣佈,所以情況並非如此。所以:不,它不會在編譯時添加這樣的內容。

其實,我們來分解一下。

public class Outer { 

    String strHello = "Hello ^^"; 

    public void printHello() { 
     System.out.println(strHello); 
    } 

    public static void main(String[] args) { 

     // This will print: Hello ^^ 
     Outer outer = new Outer(); 
     outer.printHello(); 

     // This will print: Hello ^^ 
     new Outer().printHello(); 
    } 
} 

我猜你以前見過這樣的代碼。它只是調用實例化類的方法。點符號也可以用來訪問變量和內部類。在上面我們已經將它用於實例方法。使用關鍵字static可以將方法和變量共享到該類的所有實例甚至是單獨的類。

public class Outer { 

    static String strHello = "Hello ^^"; 

    public static void printHello() { 
     System.out.println(strHello); 
    } 

    static class StaticInner { 
    } 

    static class Inner { 
    } 

    public static void main(String[] args) { 

     // Prints: Hello ^^ 
     Outer.printHello(); 

     // Constructs a new Example.StaticInner 
     Outer.StaticInner inner = new Outer.StaticInner(); 

     // Constructs a new Outer.Inner  
     Outer.Inner inner = new Example().new Inner(); 

     // Constructs a new Outer.Inner 
     Example ex = new Example(); 
     Outer.Inner inner = ex.new Inner(); 
    } 
} 

上面的代碼使用靜態內部類來希望證明內部構造函數就像其他構造函數一樣。但是,因爲它在另一個類中,我們需要通過其他(外部)類來訪問它。它不是一個靜態的內部類,那麼我們需要使用一個實例來訪問它,因爲訪問修飾符。

相關問題