內部類分為四種:
非靜態內部類
靜態內部類
匿名類本地類
步驟 1 :非靜態內部類
非靜態內部類 battlescore 「戰鬥成績」
非靜態內部類可以直接在乙個類裡面定義
比如:戰鬥成績只有在乙個英雄物件存在的時候才有意義
所以例項化battlescore 的時候,必須建立在乙個存在的英雄的基礎上
語法:new 外部類().new 內部類()
作為hero的非靜態內部類,是可以直接訪問外部類的private例項屬性name的
package charactor;
public class hero
}public static void main(string args)
}
步驟 2 :靜態內部類在乙個類裡面宣告乙個靜態內部類
比如敵方水晶,當敵方水晶沒有血的時候,己方所有英雄都取得勝利,而不只是某乙個具體的英雄取得勝利。
與非靜態內部類不同,靜態內部類水晶類的例項化不需要乙個外部類的例項為基礎,可以直接例項化
語法:new 外部類.靜態內部類();
因為沒有乙個外部類的例項,所以在靜態內部類裡面不可以訪問外部類的例項屬性和方法
除了可以訪問外部類的私有靜態成員外,靜態內部類和普通類沒什麼大的區別
package charactor;
public class hero
//敵方的水晶
static class enemycrystal}}
public static void main(string args)
}
步驟 3 :匿名類匿名類指的是在宣告乙個類的同時例項化它,使**更加簡潔精練
通常情況下,要使用乙個介面或者抽象類,都必須建立乙個子類
有的時候,為了快速使用,直接例項化乙個抽象類,並「當場」實現其抽象方法。
既然實現了抽象方法,那麼就是乙個新的類,只是這個類,沒有命名。
這樣的類,叫做匿名類
//通過列印h,可以看到h這個物件屬於hero$1這麼乙個系統自動分配的類名
system.out.println(h);}}
步驟 4 :本地類本地類可以理解為有名字的匿名類
內部類與匿名類不一樣的是,內部類必須宣告在成員的位置,即與屬性和方法平等的位置。
本地類和匿名類一樣,直接宣告在**塊裡面,可以是主方法,for迴圈裡等等地方
package charactor;
public abstract class hero
}somehero h =new somehero();
h.name ="地卜師";
h.attack();}}
步驟 5 :在匿名類中使用外部的區域性變數在匿名類中使用外部的區域性變數,外部的區域性變數必須修飾為final
為什麼要宣告為final,其機制比較複雜,請參考第二個hero**中的解釋
注:在jdk8中,已經不需要強制修飾成final了,如果沒有寫final,不會報錯,因為編譯器偷偷的幫你加上了看不見的final
package charactor;
public abstract class hero };}
}package charactor;
public abstract class hero
public void attack()
}hero h = new anonymoushero(damage);}}
Java自學 介面與繼承 隱藏
與重寫類似,方法的重寫是子類覆蓋父類的物件方法 隱藏,就是子類覆蓋父類的類方法 步驟 1 父類 父類有乙個類方法 battlewin package charactor public class hero 步驟 2 子類隱藏父類的類方法 package charactor public class ...
Java自學 介面與繼承 重寫
子類可以繼承父類的物件方法 在繼承後,重複提供該方法,就叫做方法的重寫 又叫覆蓋 override 步驟 1 父類item 父類item有乙個方法,叫做effect package property public class item public void effect 步驟 2 子類lifepo...
Java自學 介面與繼承 預設方法
步驟 1 什麼是預設方法 預設方法是jdk8新特性,指的是介面也可以提供具體方法了,而不像以前,只能提供抽象方法 mortal 這個介面,增加了乙個預設方法revive,這個方法有實現體,並且被宣告為了default package charactor public inte ce mortal 步...