Java中的內部類

來源:互聯網
上載者:User

標籤:

內部類( Inner Class )就是定義在另外一個類裡面的類。與之對應,包含內部類的類被稱為外部類。將相關的類組織在一起,從而降低了命名空間的混亂。

內部類的好處:

1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類

2. 內部類的方法可以直接存取外部類的所有資料,包括私人的資料

3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便

內部類可分為以下幾種:

  • 成員內部類  member inner class
  • 靜態內部類  static inner class (also called nested class)
  • 方法內部類  local inner class
  • 匿名內部類  anonymous inner class
Java 中的成員內部類

內部類中最常見的就是成員內部類,也稱為普通內部類。我們來看如下代碼:

 

運行結果為:

從上面的代碼中我們可以看到,成員內部類的使用方法

1、 Inner 類定義在 Outer 類的內部,相當於 Outer 類的一個成員變數的位置,Inner 類可以使用任意存取控制符,如 public 、 protected 、 private 等

2、 Inner 類中定義的 test() 方法可以直接存取 Outer 類中的資料,而不受存取控制符的影響,如直接存取 Outer 類中的私人屬性a

3、 定義了成員內部類後,必須使用外部類對象來建立內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );

4、 編譯上面的程式後,會發現產生了兩個 .class 檔案

其中,第二個是外部類的 .class 檔案,第一個是內部類的 .class 檔案,即成員內部類的 .class 檔案總是這樣:外部類名$內部類名.class

另外,友情提示哦:

1、 外部類是不能直接使用內部類的成員和方法滴

可先建立內部類的對象,然後通過內部類的對象來訪問其成員變數和方法。

2、 如果外部類和內部類具有相同的成員變數或方法,內部類預設訪問自己的成員變數或方法,如果要訪問外部類的成員變數,可以使用 this 關鍵字。如:

運行結果:

Java 中的靜態內部類

靜態內部類是 static 修飾的內部類,這種內部類的特點是:

1、 靜態內部類不能直接存取外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問 

2、 如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員

3、 建立靜態內部類的對象時,不需要外部類的對象,可以直接建立 內部類 對象名= new 內部類();

 

運行結果 : 

Java 中的方法內部類

方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。

注意:由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用存取控制符和 static 修飾符。

匿名內部類

匿名內部類就是沒有名字的局部內部類,不使用關鍵字class, extends, implements, 沒有構造方法。

  匿名內部類隱式地繼承了一個父類或者實現了一個介面

  匿名內部類使用得比較多,通常是作為一個方法參數。

匿名內部類使用測試

 

package com.learnjava.innerclass;

import java.util.Date;

public class AnonymouseInnerClass

{

    @SuppressWarnings("deprecation")

    public String getDate(Date date)

    {

        return date.toLocaleString();

    }

    public static void main(String[] args)

    {

        AnonymouseInnerClass test = new AnonymouseInnerClass();

        // 列印日期:

        String str = test.getDate(new Date());

        System.out.println(str);

        System.out.println("----------------");

        // 使用匿名內部類

        String str2 = test.getDate(new Date()

        {

        });// 使用了花括弧,但是不填入內容,執行結果和上面的完全一致

            // 產生了一個繼承了Date類的子類的對象

        System.out.println(str2);

        System.out.println("----------------");

        // 使用匿名內部類,並且重寫父類中的方法

        String str3 = test.getDate(new Date()

        {

            // 重寫父類中的方法

            @Override

            @Deprecated

            public String toLocaleString()

            {

                return "Hello: " + super.toLocaleString();

            }

        });

        System.out.println(str3);

    }

}

 

產生的.class檔案中,匿名類會產生OuterClass$1.class檔案,數字根據是第幾個匿名類而類推。

 

Java中的內部類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.