Thinking in java自讀筆記:內部類
阿新 • • 發佈:2018-11-05
首先推薦一篇內部類講解詳細的部落格地址:https://www.cnblogs.com/dolphin0520/p/3811445.html
一.內部類的四種類型
- 成員內部類
- 區域性內部類
- 匿名內部類
- 靜態內部類
(一)成員內部類是最普通的內部類,直接在一個外部類裡面定義一個成員類(即內部類)。
class OutClass
{
class InnerClass
{
private int i;
public InnerClass(int i)
{
i=this .i;
}
public int getI() {
return i;
}
}
public InnerClass Get()
{
return new InnerClass(10);
}
}
成員內部類的初始化方式一般有2種:
- 定義一個外部類的物件,然後用外部類的物件new一個內部類物件。
OutClass out=new OutClass();
OutClass.InnerClass inner=out.new InnerClass(10); - 在外部類裡面定義一個方法new一個內部類物件。
OutClass.InnerClass inner=out.Get();
注意點:內部類如果與外部類有相同的方法和欄位,則內部類會覆蓋外部類的方法和欄位,要訪問外部類的方法和欄位要用:外部類.this.方法和外部類.this.欄位來訪問。成員內部類可以無條件訪問外部類的成語或欄位,但外部類訪問成員內部類只有通過內部類的物件來訪問。成員內部類因為像外部類的一個成員,因此具備四種訪問許可權,具體訪問許可權可以理解為一個成員變數。
(二)區域性內部類
區域性內部類是定義在一個方法內部或者一個作用域裡面的類,和成員類相比較的話,可以把成員類比較為一個外部類的成員,區域性類則是一個作用域的臨時成員,因此不能設定訪問許可權。
class OutClass
{
int i;
public OutClass Get()
{
class InnerClass extends OutClass
{
int num;
public InnerClass(int num)
{
this.num=num;
}
}
return new InnerClass(10);
}
}
在該測試程式碼中,返回的內部類上溯造型成一個外部類物件。
(三)匿名內部類
匿名內部類一般繼承與抽象類或者介面,重寫其中的方法供回撥使用,在寫事件的監聽與維護方面十分方便。
public class Test {
public static void main(String[] args)
{
OutClass out=new OutClass();
IPrint ip=out.Get();
ip.print();
}
}
interface IPrint
{
void print();
}
class OutClass
{
public IPrint Get()
{
return new IPrint() {
@Override
public void print() {
System.out.println("測試");
}
};
}
}
(四)靜態內部類
靜態內部類可以不依賴於一個外部類物件,可以直接理解為一個外部類的靜態成員變數,用外部類.內部類的形式訪問。
public class Test {
public static void main(String[] args) {
System.out.println(new OutClass.Inner());
}
}
class OutClass
{
int i;
public static class Inner
{
public static int num=5;
public Inner()
{
System.out.println("------")
}
}
}
總結:除了匿名內部類以外,成員內部類,區域性內部類以及靜態內部類都可以理解為一個類的類成員,區域性變數以及靜態成員,作為成員,因此保留著成員的特性,如訪問許可權等,可以和普通的成員訪問一樣訪問它們,但作為類,它們又擁有類的特性,因此可以把這3種內部類看作為成員與類的結合體,同時擁有著成員與類的特性。