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