【3】匿名內部類
阿新 • • 發佈:2020-07-10
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); } }