1. 程式人生 > >Thinking in java自讀筆記:內部類

Thinking in java自讀筆記:內部類

首先推薦一篇內部類講解詳細的部落格地址: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種內部類看作為成員與類的結合體,同時擁有著成員與類的特性。