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