1. 程式人生 > >java中的內部類(巢狀類)

java中的內部類(巢狀類)

1.內部類:定義在另一個類裡面的類 外部類:包含內部類的類
2.內部類的名字不允許與外部類的名字相同。因為在外部引用它時必須給出帶有外部類名的完整名稱(外部類名.內部類名)
3.內部類可以是抽象類或介面,若是介面,則可以由其他巢狀類實現。
4.巢狀類不要濫用,在圖形化中可以使用,其他慎用。
5.外部類只能是public或者預設,不可以是protected之類;內部類訪問控制符均可,也可使用abstract或者final修飾。

內部類的主要作用如下:
1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
2. 內部類的方法可以直接訪問外部類的所有資料,包括私有的資料

(內部類的訪問控制符也是隨意的 就相當於外部類的一個方法)
3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便

內部類可分為:成員內部類(普通內部類)、靜態內部類、方法內部類、匿名內部類。

定義了成員內部類後,必須使用外部類物件來建立內部類物件,而不能直接去 new 一個內部類物件,即:內部類 物件名 = 外部類物件.new 內部類( );(是說在外部類之外的其他類裡的條件下)
例如:

//外部類HelloWorld
public class HelloWorld {

    // 內部類Inner,類Inner在類HelloWorld的內部
    public class
Inner {
// 內部類的方法 public void show() { System.out.println("welcome!"); } } public static void main(String[] args) { // 建立外部類物件 HelloWorld hello = new HelloWorld(); // 建立內部類物件 Inner i = hello.new Inner(); //或hello.Inner i = hello.new Inner();
// 呼叫內部類物件的方法 i.show(); } }

1、 外部類是不能直接使用內部類的成員和方法的。可先建立內部類的物件,然後通過內部類的物件來訪問其成員變數和方法。
2.如果外部類和內部類具有相同的成員變數或方法,內部類預設訪問自己的成員變數或方法,如果要訪問外部類的成員變數,可以使用 this 關鍵字。例如:HelloWorld.this.方法/成員

class A{
    private int s = 111;

    public class B{
        private int s = 222;
        public void mb(int s){
            System.out.println(s);//區域性變數
            System.out.println(this.s);//內部類屬性
            System.out.println(A.this.s);//外部類屬性
        }
    }
}

靜態內部類是 static 修飾的內部類,有些人認為其實靜態內部類實際是一種外部類,因為它與外部類例項化出來的物件無關。
這種內部類的特點是:
1、 靜態內部類不能直接訪問外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問
2、 如果外部類的靜態成員與內部類的成員名稱相同,可通過“外部類名.靜態成員”訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接呼叫外部類的靜態成員
3、 建立靜態內部類的物件時,不需要外部類的物件,可以直接建立 內部類 物件名= new 內部類();(同樣在外部類之外其他類的條件下)

方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。(在方法內使用時也要先建立物件才能呼叫方法,不過不需要先建立外部類物件
一定要注意:由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符,但可以被final和abstract修飾。
只有當該成員方法的區域性變數和引數是final的才能被方法內部類使用。也即如果引數或者其他的區域性變數不是final的,就不能在成員內部類中使用。

匿名內部類
不取名字,直接用父類或介面的名字(不使用extends或implements) 即 new 類名(){} 一次性的 定義的同時實現
構造物件時使用父類的構造方法(本身不能定義構造方法 因為沒有名字)
通常用於方法的引數之類

若在外部類的main方法中 想建立內部類物件 是不能直接 Addition aProblem = new Addition(pow);這樣的
(比如Addition是內部類 innerAddition是外部類)而應該Addition aProblem = new innerAddition().new Addition(pow);
主要是 main方法是靜態方法 所以不能呼叫動態方法 要先new出外部類 要是不想像上面那麼寫只能把類變成靜態的(public static Addition{}
報錯資訊有點奇怪:No enclosing instance of type XXX is accessible. Must qualify the allocation with an enclosing instance of type XXX