1. 程式人生 > 實用技巧 >【3】匿名內部類

【3】匿名內部類

1.什麼是匿名類

匿名類,就是沒有名稱的類,其名稱由Java編譯器給出,一般是形如:

​ 外部類名稱+$+匿名類順序,沒有名稱也就是其他地方就不能引用,不能例項化,只用一次,當然也就不能有構造器。

  • 匿名類就是利用父類的建構函式和自身類體構造成一個類
  • 格式:new 父類{}{子類內容};
2.為什麼要使用匿名類

匿名類指的是在宣告一個類的同時例項化它,使程式碼更加簡潔精練

3.匿名類怎麼使用
package charactor;
  
public abstract class Hero {
    String name; //姓名
         
    float hp; //血量
         
    float armor; //護甲
         
    int moveSpeed; //移動速度
     
    public abstract void attack();
     
    public static void main(String[] args) {
         
        ADHero adh=new ADHero();
        //通過列印adh,可以看到adh這個物件屬於ADHero類
        adh.attack();
        System.out.println(adh);
         
        Hero h = new Hero(){
            //當場實現attack方法
            public void attack() {
                System.out.println("新的進攻手段");
            }
        };
        h.attack();
        //通過列印h,可以看到h這個物件屬於Hero$1這麼一個系統自動分配的類名
         
        System.out.println(h);
    }
     
}

4.注意事項

在匿名類中使用外部的區域性變數,外部的區域性變數必須修飾為final

package charactor;
   
public abstract class Hero {
 
    public abstract void attack();
      
    public static void main(String[] args) {
 
        //在匿名類中使用外部的區域性變數damage 必須修飾為final
        int damage = 5;
         
        //這裡使用本地類AnonymousHero來模擬匿名類的隱藏屬性機制
         
        //事實上的匿名類,會在匿名類裡宣告一個damage屬性,並且使用構造方法初始化該屬性的值
        //在attack中使用的damage,真正使用的是這個內部damage,而非外部damage
         
        //假設外部屬性不需要宣告為final
        //那麼在attack中修改damage的值,就會被暗示為修改了外部變數damage的值
         
        //但是他們倆是不同的變數,是不可能修改外部變數damage的
        //所以為了避免產生誤導,外部的damage必須宣告為final,"看上去"就不能修改了
        class AnonymousHero extends Hero{
            int damage;
            public AnonymousHero(int damage){
                this.damage = damage;
            }
            public void attack() {
                damage = 10;
                System.out.printf("新的進攻手段,造成%d點傷害",this.damage );
            }
        }
         
        Hero h = new AnonymousHero(damage);
         
    }
      
}