3 回答
TA貢獻1856條經驗 獲得超11個贊
您可以在 Java 中的匿名類中定義新方法或字段,但是當您將該匿名類定義分配給父類類型時,您將無法調用匿名類中定義的新方法或通過父類參考。
當你做這樣的事情時:
Cat gato = new Cat() {
int legs = 4;
public void scratch() {
System.out.println("scratch");
}
}
您實際上是Cat用匿名類擴展該類,然后在該匿名子類中定義新方法?,F在,當您將子類實例分配給父類引用時,無法通過父類引用調用新方法,因為父類不知道它們。
要調用它,您需要立即調用它:
new Cat() {
int legs = 4;
public void scratch() {
System.out.println("scratch");
}
}.scratch();
因此,您可以在匿名子類中定義新方法或字段,但不能通過父引用調用它們,要么在內部使用它們,要么直接調用它們(如我演示的那樣)。
通常,匿名類會重寫父類方法或內聯實現接口。Java 8之前的函數式接口可以通過匿名類來實現,Java 8之后主要通過lambda表達式來實現。
TA貢獻1998條經驗 獲得超6個贊
更多的是附錄,因為其他答案并不是 100% 完整:
您可以在 Java 中的匿名類中定義新方法或字段,但是當您將該匿名類定義分配給父類類型時,您將無法調用匿名類中定義的新方法或通過父類參考。
這是正確的,但從 Java 10 開始,我們有了關鍵字var:
var?cat?=?new?Cat()?{?int?legs?=?4;?...現在編譯器知道:您不僅創建了該匿名內部類,而且現在編譯器知道這是該內部cat類的實例。在此之前,您只能使用引用來表示內部類的實例。現在您可以使用知道這比普通貓“更多”的東西。因此,使用 java 10,您現在可以在該內部類之外執行操作!現在有一種方法來表示內部類實例,以跟蹤其真實性質!CatvarSystem.out.println(cat.legs)
這實際上在現實世界中很有價值,例如:
Henri Tremblay 很好地使用了這個技巧,使用匿名內部類來模擬 Java 中元組的概念。
TA貢獻1827條經驗 獲得超9個贊
首先,您的代碼未編譯。要聲明類,不應使用括號。
假設你的具體類Cat是這樣的。
class Cat {
void meow() {
System.out.println("I'm a cat!");
};
}
你可以像這樣實例化匿名類
Cat cat = new Cat() {
int lives = 9;
@Override
void meow() {
super.meow();
System.out.printf("And I have %s lives!", lives);
}
};
cat.meow();
//prints:
//I'm a cat!
//And I have 9 lives!
添加回答
舉報
