2011-12-08 93 views
0

是否有可能在Java中創建一個匿名類是這樣的:匿名類在Java中

public static void main(String[] args) { 

    AnonymousClass a = new AnonymousClass() { 
     int whatever = 1; 
    }; 

    System.out.println(a.whatever); 
} 

我認爲這會工作,但事實並非如此。我是否誤解了匿名類的某些內容或僅存在語法錯誤?

+2

*什麼*不起作用?你應該真的發佈錯誤! –

+1

如果您還沒有定義'AnonymousClass',它將不起作用! – adarshr

回答

0

您指的是原始的匿名類實例,它沒有字段「whatever」 - 因此您不能以這種方式引用它。

2

對於這項工作,AnonymousClass需要是接口或一類:

private interface AnonymousClass { 

} 

public static void main(String[] args) { 

     AnonymousClass a = new AnonymousClass() { 
      int whatever = 1; 
     }; 

    System.out.println(a.whatever); // this won't work 
} 

EDIT

糾正,如在評論正確地指出,whatever不會訪問/存在。

+4

它不會編譯,'a.whatever'不可見。 – axtavt

+2

除了打印語句不起作用。 'a'的類型是AnonymousClass(接口),它沒有指定'whatever'的存在。 – Alderath

2

如果可能,我們不會再稱它們爲匿名:您的示例定義了一個類名爲:Anonymous。您可以定義與這樣一個名字的內部類:

public static void main(String[] args) { 
    class NotAnonymous { 
     public int whatever = 1; 
    } 
    NotAnonymous na = new NotAnonymous(); 
    System.out.println(na.whatever); 
} 
4

可以這樣來做:

public static void main(String[] args) { 
    System.out.println(new Object() { 
     int whatever = 1; 
    }.whatever); 
} 

也就是說,你只能提領從實例中的字段和直接的方法表達。 [編輯:根據註釋,您可以在編譯器爲您推斷類型的地方使用它 - 恰好是實例表達式,或者將其傳遞給通用方法的返回值。]您無法存儲它在一個變量中,並使用字段/方法,所以它不像匿名類那樣有用C#。

編輯:你可以像以前別人說,聲明的方法局部類:

public static void main(String[] args) { 
    class Local { 
     int whatever = 1; 
    } 
    Local local = new Local(); 
    System.out.println(local); 
} 

稍微羅嗦,不過,像非靜態內部類和普通匿名類,它保留隱含引用this(在非靜態方法中)。

+1

+1不知道這是可能的! – helpermethod

+0

@gustafc:匿名類還保留對外部對象的隱式引用。與方法本地類沒有區別。 –

+2

作爲一種職業生涯,你可以非直接地[微微]做。通過一個方法'私有靜態 T fn(T值){返回值; }'。 –

0

你可以像這樣創建你的班級,當然。但是,a.whatever調用將失敗,因爲對象類型仍爲AnonymousClass,並且它沒有將whatever定義爲屬性。

如果覆蓋已經在AnonymousClass類或接口中定義的某些方法或屬性,該對象將使用來自匿名類而不是舊類的實現,但如果引入新方法或屬性則不會。