特點
- 是沒有名稱的內部類,沒有辦法引用它們。必須在創建時,用new語句的一部分來聲明並創建他們的實例
- 必須繼承一個類(抽象的,非抽象的都可以)或者實現一個接口。如果父類或接口是抽象類,匿名內部類必須實現其所有的抽象方法
- 在匿名內部類中可以定義代碼塊,用於實例的初始化,但是不能定義靜態代碼塊
語法
- new interface/ superclass(){ 類體 }
- 這種形式的new語句聲明一個新的匿名類,它對一個給定的類進行擴展。或者實現一個給定的接口,並同時創建該匿名類的一個新的實例
應用
public class AnonymousInner {
public static void main(String[] args) {
Person p=new Person();
//如果dog對象我們只使用一下下,那麼給他創建一個引用是划不來的
/* Animal dog=new Dog();
p.feed(dog);*/
//使用匿名內部類,創建Animal的子類對象,直接在子對象中實現需要的方法
p.feed(new Animal(){
public void eat(){
System.out.println("eating bones");
}
});
//多次調用匿名內部類的話把匿名內部類對象賦值給引用變量
Animal cat=new Animal(){
public void eat(){
System.out.println("eating fish");
}
};
p.feed(cat);
//匿名內部類對象可以調用自身的方法,
//下面的代碼除了實現父類Animal的eat方法,還擁有自己的show方法,在創建了之後,就可以直接調用。
new Animal(){
private String name="cat";
//匿名內部類可以有非靜態代碼塊
{
name="Tiger";
}
public void eat(){
System.out.println("eating fish");
}
public void show(){
System.out.println(name);
}
}.show();
}
}
class Person{
public void feed(Animal animal){
animal.eat();
}
}
abstract class Animal{
public abstract void eat();
}
//使用了匿名內部類,這個子類也就沒有必要單獨建了,
//如果子類只使用一次,建議不要創建子類,而是通過匿名內部類實現父類或接口的方法來完成。
/*class Dog extends Animal{
public void eat(){
System.out.println("eating bones");
}
}*/