匿名類和本地類
阿新 • • 發佈:2021-01-14
匿名類和本地類的理解和使用
首先要了解抽象類的定義,在類中宣告一個方法,這個方法沒有實現體,是一個“空”方法
這樣的方法就叫抽象方法,使用修飾符“abstract"
當一個類有抽象方法的時候,該類必須被宣告為抽象類
package charactor;
public abstract class Hero {
String name;
float hp;
float armor;
int moveSpeed;
public static void main(String[] args) {
}
// 抽象方法attack
// Hero的子類會被要求實現attack方法
public abstract void attack();
}
Hero類可以在不提供抽象方法的前提下,宣告為抽象類
一旦一個類被宣告為抽象類,就不能夠被直接例項化
下面來說匿名類
匿名類指的是在宣告一個類的同時例項化它,使程式碼更加簡潔精練
通常情況下,要使用一個介面或者抽象類,都必須建立一個子類
有的時候,為了快速使用,直接例項化一個抽象類,並“當場”實現其抽象方法。
既然實現了抽象方法,那麼就是一個新的類,只是這個類,沒有命名。
這樣的類,叫做匿名類
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);
}
}
那麼這個時候就有人有疑問,不是說抽象類不能被例項化嗎?但其實是因為在實現抽象方法時,實際已經生成了一個新(匿名)類,就如講解中示例的Hero$1這個類。
換言之,也就不是將抽象類Hero例項化了,實際上例項化的是匿名類Hero$1,這才是匿名的真意。
本地類可以理解為有名字的匿名類
package charactor;
public abstract class Hero {
String name; //姓名
float hp; //血量
float armor; //護甲
int moveSpeed; //移動速度
public abstract void attack();
public static void main(String[] args) {
//與匿名類的區別在於,本地類有了自定義的類名
class SomeHero extends Hero{
public void attack() {
System.out.println( name+ " 新的進攻手段");
}
}
SomeHero h =new SomeHero();
h.name ="地卜師";
h.attack();
}
}