【內部類】匿名內部類及應用

特點

  • 是沒有名稱的內部類,沒有辦法引用它們。必須在創建時,用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");
     }
}*/
發佈了58 篇原創文章 · 獲贊 31 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章