是否有可能在Java中創建一個匿名類是這樣的:匿名類在Java中
public static void main(String[] args) {
AnonymousClass a = new AnonymousClass() {
int whatever = 1;
};
System.out.println(a.whatever);
}
我認爲這會工作,但事實並非如此。我是否誤解了匿名類的某些內容或僅存在語法錯誤?
是否有可能在Java中創建一個匿名類是這樣的:匿名類在Java中
public static void main(String[] args) {
AnonymousClass a = new AnonymousClass() {
int whatever = 1;
};
System.out.println(a.whatever);
}
我認爲這會工作,但事實並非如此。我是否誤解了匿名類的某些內容或僅存在語法錯誤?
您指的是原始的匿名類實例,它沒有字段「whatever」 - 因此您不能以這種方式引用它。
對於這項工作,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
不會訪問/存在。
如果可能,我們不會再稱它們爲匿名:您的示例定義了一個類名爲:Anonymous
。您可以定義與這樣一個名字的內部類:
public static void main(String[] args) {
class NotAnonymous {
public int whatever = 1;
}
NotAnonymous na = new NotAnonymous();
System.out.println(na.whatever);
}
您可以這樣來做:
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不知道這是可能的! – helpermethod
@gustafc:匿名類還保留對外部對象的隱式引用。與方法本地類沒有區別。 –
作爲一種職業生涯,你可以非直接地[微微]做。通過一個方法'私有靜態
你可以像這樣創建你的班級,當然。但是,a.whatever
調用將失敗,因爲對象類型仍爲AnonymousClass
,並且它沒有將whatever
定義爲屬性。
如果覆蓋已經在AnonymousClass
類或接口中定義的某些方法或屬性,該對象將使用來自匿名類而不是舊類的實現,但如果引入新方法或屬性則不會。
*什麼*不起作用?你應該真的發佈錯誤! –
如果您還沒有定義'AnonymousClass',它將不起作用! – adarshr