内部類(Inner Class)學習知識點總結:
1、概念
把一個類定義到另一個類的内部的類就叫内部類,内部類可以看作是外部類的一個成員(與類的屬性和方法類似)。
内部類一樣可以有自己的子類,可以被繼承。
2、分類
①靜态内部類(static inner class)
靜态内部類是指被static修飾的内部類,它可以不依賴與外部OuterClass類的執行個體而執行個體化,類似與靜态函數,靜态變量一樣,随着類加載而被建立。另外靜态内部類不能與外部類有相同的名字,不能通路外部類的普通成員變量,隻能通路外部類中靜态成員和靜态方法(根據靜态成員不能通路非靜态成員的規則)。靜态内部類的成員方法(包含類方法和執行個體方法)不能通路外部類的執行個體方法。(執行個體方法指非靜态方法)
②成員内部類(member inner class)
成員内部類中可以通路外部類的所有成員變量和方法,包括靜态和非靜态。
成員内部類(非靜态内部類)的使用權限:
- ①private修飾:隻能在外部類的内部使用
- ②預設修飾:隻能被與外部類處于同一包中的其他類所通路
- ③protected修飾:可以被與外部類處于同一包的其他類以及外部類的子類通路
- ④public修飾:可以在任何地方使用
③局部内部類(local inner class)
局部内部類中可以通路外部類的所有成員變量和方法,包括靜态和非靜态。
④匿名内部類(anonymous inner class)
匿名内部類可以通路外部類的靜态成員變量和靜态方法,不能通路非靜态成員變量和方法。
3、匿名内部類同時需要注意幾個方面:
1)匿名内部了不能有構造函數
2)匿名内部類不能定義靜态成員、靜态方法和類
3)匿名内部類不能是 public、protected、private、static。
4)隻能建立匿名内部類的一個執行個體。
5)一個匿名内部類一定是在new 的後面,這個匿名内部類必須內建一個父類或是實作一個接口。(下面的代碼執行個體是實作了一個接口的方式定義匿名内部類)
4、各個内部類定義執行個體如下:
interface Inner {
void say();
}
class OuterClass {
int a;
static int b = 10;
String name = "OuterName";
static class StaticInnerClass {
void test(){
// System.out.println("a="+a);//不可以通路非靜态變量
System.out.println("b="+b);
}
}//靜态内部類
class MemberInnerClass {
private String name = "InnerClass";
void test(){
System.out.println("a="+a);
System.out.println("b="+b);
}
public void setName(String name){
System.out.println(name);//調用形參的name屬性
System.out.println(this.name);//調用内部類的name同名屬性
System.out.println(OuterClass.this.name);//調用外部類的同名屬性
}
}//成員内部類
public void method() {
class LocalInnerClass {
void test(){
System.out.println("a="+a);
System.out.println("b="+b);
}
}//局部内部類
}
public void method1(Inner inner1) {
System.out.println("實體函數");
}
public static void main(String[] args) {
new OuterClass().method1(new Inner() {//匿名内部類
@Override
public void say() {}
void test(){
// System.out.println("a="+a);//不可以通路非靜态變量
System.out.println("b="+b);
}
});
}
}
5.内部類在外部類外使用方法:
①非靜态内部類:
- 在外部類的内部:In in = new In();//與平常用的類沒有太大差別
- 在外部類的外部:Out.In in = new Out().new In();//因成員内部類是外部類的成員,是以要依附外部類的對象上使用
②靜态内部類:
- 在外部類的内部:In in = new In();//與平常用的類沒有太大差別
- 在外部類的外部:Out.In in = new Out.In();//因成員内部類是外部類的成員,是以要依附外部類的對象上使用