天天看點

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 = ;

    public class B{
        private int s = ;
        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