內部類分爲四種:this
調用方法: new 外部類().new 內部類()
code
package charactor; public class Hero { private String name; // 姓名 float hp; // 血量 float armor; // 護甲 int moveSpeed; // 移動速度 // 非靜態內部類,只有一個外部類對象存在的時候,纔有意義 // 戰鬥成績只有在一個英雄對象存在的時候纔有意義 class BattleScore { int kill; int die; int assit; public void legendary() { if (kill >= 8) System.out.println(name + "超神!"); else System.out.println(name + "還沒有超神!"); } } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "蓋倫"; // 實例化內部類 // BattleScore對象只有在一個英雄對象存在的時候纔有意義 // 因此其實例化必須創建在一個外部類對象的基礎之上 BattleScore score = garen.new BattleScore(); score.kill = 9; score.legendary(); } }
調用方法: new 外部類.靜態內部類();
對象
由於沒有一個外部類的實例,因此在靜態內部類裏面不能夠訪問外部類的實例屬性和方法
除了能夠訪問外部類的私有靜態成員外,靜態內部類和普通類沒什麼大的區別。it
package charactor; public class Hero { public String name; protected float hp; private static void battleWin() { System.out.println("battle win"); } // 敵方的水晶 static class EnemyCrystal { int hp = 5000; // 若是水晶的血量爲0,則宣佈勝利 public void checkIfVictory() { if (hp == 0) { Hero.battleWin(); // 靜態內部類不能直接訪問外部類的對象屬性 System.out.println(name + " win this game"); } } } public static void main(String[] args) { // 實例化靜態內部類 Hero.EnemyCrystal crystal = new Hero.EnemyCrystal(); crystal.checkIfVictory(); } }
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); } }
本地類能夠理解爲有名字的匿名類
與內部類不同的是,內部類必須聲明在成員的位置,即與屬性和方法平等的位置。
本地類和匿名類同樣,直接聲明在代碼塊裏面,能夠是主方法,for循環裏等等地方for循環
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(); } }