內部類

內部類

內部類分爲四種: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();
    }

}
相關文章
相關標籤/搜索