3)Java學習筆記:內部類

什麼是內部類

內部類是指在一個外部類的內部再定義一個類。內部類做爲外部類的一個成員,而且依附於外部類而存在的。內部類可爲靜態,可用protected和private修飾(而外部類只能使用public和缺省的包訪問權限)。內部類主要有如下幾類:成員內部類、局部內部類、靜態內部類、匿名內部類ide

爲何要使用內部類

①內部類提供了更好的封裝,除了該外圍類,同一個包下的其餘類都不能訪問
②內部類並無使人迷惑的「is-a」關係,他就是一個獨立的實體
③內部類能夠對同一個包中的其餘類隱藏起來,通常的非內部類,是不容許有 private 與protected權限的,但內部類能夠
④能夠實現多繼承
⑤當想要定義一個回調函數且不想編寫大量代碼時,使用匿名內部類比較便捷函數

內部類特性

①內部類仍然是一個獨立的類,在編譯以後內部類會被編譯成獨立的.class文件,可是前面冠之外部類的類名和$符號
②內部類聲明成靜態的,就不能隨便的訪問外部類的成員變量了,此時內部類只能訪問外部類的靜態成員變量
③外部類不能直接訪問內部類的的成員,但能夠經過內部類對象來訪問
④內部類能夠自由地訪問外部類的成員變量,不管是不是private的
⑤由於當某個外圍類的對象建立內部類的對象時,此內部類會捕獲一個隱式引用this

實現多重繼承

class Eat {
    public void eat() {
        System.out.println("eat()");
    }
}

class Drink {
    public void drink() {
        System.out.println("drink()");
    }
}

public class MutiExtend {
    private EatExtra eat = null;
    private DrinkExtra drink = null;

    MutiExtend() {
        eat = new EatExtra();
        drink = new DrinkExtra();
    }

    public void drink() {
        drink.drink();
        System.out.println("drinkExtra()");
    }

    public void eat() {
        eat.eat();
        System.out.println("eatExtra()");
    }

    private class EatExtra extends Eat {
        
        // inner class can not have static declaration
//        static int age;
        // allowed,由於在compile階段就已經肯定了
        static final int name = 123;
        @Override
        public void eat() {
            super.eat();
        }
    }

    private class DrinkExtra extends Drink {
        @Override
        public void drink() {
            super.drink();
        }
    }
}

注意事項

①內部類不能定義靜態成員變量和方法
②內部類訪問外部類實例用: 外部類名.this.變量名
③建立內部類: outerClassInstane.new InnerClass()code

局部內部類

①不能範圍該方法的非final局部變量
②不能夠定義靜態變量對象

靜態內部類

①要建立嵌套類的對象,並不須要其外圍類的對象繼承

一種比較好的用法

public class AuthModule {

//    private static int SUCCESS = 200;
//    private static int FAIL = 400;

    // 比這種實現要好不少吧,可是隻限因而該類的狀態,這樣能夠有命名空間Status
    private static class Status {
        private static int SUCCESS = 200;
        private static int FAIL = 400;
    }

    public void doSomething() {
        System.out.println(Status.SUCCESS);
        System.out.println(Status.SUCCESS);
    }
}
相關文章
相關標籤/搜索