2011-04-14 50 views
0

我是Java新手。我有2個問題。
問題1:當objDummy嘗試通過構造函數調用創建時,
爲什麼沒有分號?
怎麼能有一個額外的調用init()?Java中的方法調用語法

問題2:爲什麼在註釋行「constructor ends」處有分號?
它是Java語法的一部分嗎?

public abstract class A { 
    private static final A createDummy() { 
    // what is the meaning of the following syntax? Qn. 1 
    if (objDummy == null) { 
    objDummy = new A (null, null, null){ 
     final void init(String a, String b, Object[][] cArray) { 
     } 

     public final boolean isSend() { 
     return false; 
     } 
    // Question 2: format 
    }; //constructor ends 
    }//if ends 
    return objDummy; 
    } // function createDummy ends 
}//class ends 
+2

我冒昧地重新格式化問題中的源代碼,使結構更加明顯(我只調整了空格,沒有其他更改)。 – 2011-04-14 10:07:24

+0

@Joachim:謝謝,我對格式不正確表示歉意!感謝所有成員提供的答案! – Raiden 2011-04-15 07:51:59

回答

2

你看到的是一個匿名的內部類聲明。

init()方法沒有被調用,它被覆蓋。

這就像寫:

class Foo extends A { 

    /* some constructor declaration goes here */ 

    final void init(String a, String b, Object[][] cArray) {} 

    public final boolean isSend() { return false; } 
} 

然後

objDummy = new Foo(null, null, null); 

這只是壓縮成一個單一的表達中,你都定義的A一個子類,並創建實例。至於爲什麼語法是這樣的,我想答案很簡單,就是這樣設計的。當你思考表達的含義時,這也是有道理的。

3

問題1:當試圖通過構造函數調用創建objDummy時, 爲什麼沒有分號?

有,這是你問的問題2.

你有什麼有一個anonymous class(從new A(null, null, null) {位通過對您參閱問題2 };)之一。這就是創建一個類,調用它的構造函數,然後返回分配給objDummy的結果實例。

怎麼能有一個額外的調用init()?

init不被那裏,它在匿名類被定義。起初語法可能有點混亂,但一旦你意識到它定義了一個類,它就變得更清晰了。

這可能會是大致再這樣寫的:

public abstract class A { 

    private static final A createDummy() { 
     if (objDummy == null) { 
      objDummy = new ASubclass(null, null, null); 
     } 
     return objDummy; 
    } 

    private static class ASubclass extends A { 
     final void init(String a, String b, Object[][] cArray) { 
     } 

     public final boolean isSend() { 
      return false; 
     } 
    } 
} 

再次聲明,這完全一樣(它不會編譯,但也與原來的代碼;有缺少的構造函數,缺少objDummy聲明),但希望它能澄清一點。詳情請參閱鏈接。下面是一個猜測,在構造函數和一個版本,使得編譯:

public abstract class A { 
    private static A objDummy; 

    A(String a, String b, Object[][] cArray) { 
    } 

    private static final A createDummy() { 
     if (objDummy == null) { 
      objDummy = new ASubclass(null, null, null); 
     } 
     return objDummy; 
    } 

    private static class ASubclass extends A { 
     ASubclass(String a, String b, Object[][] cArray) { 
      super(a, b, cArray); 
     } 

     final void init(String a, String b, Object[][] cArray) { 
     } 

     public final boolean isSend() { 
      return false; 
     } 
    } 
} 
1

您的代碼定義擴展A.這是相同的匿名內部類:

public abstract class A { 

private static final A createDummy() { 
// what is the meaning of the following syntax? Qn. 1 
if (objDummy == null) { 
    objDummy = new B (null, null, null); //constructor ends 
}//if ends 
return objDummy; 
} // function createDummy ends 
}//class ends 

public class B extends A{ 
    final void init(String a, String b, Object[][] cArray) { 
    } 

    public final boolean isSend() { 
    return false; 
    } 
} 

但與僅例外是你的匿名內部類沒有類名,並且它也隱含了對其包含類的引用。您可以通過調用「A.this」來使用該參考。

如果你看看我要發佈的代碼,它會變得更清楚爲什麼你需要冒號:你基本上聲明你的匿名內部類在B的構造函數的最後一個括號和它後面的分號之間。