java 嵌套類(翻譯自Java Tutorials)

來源:互聯網
上載者:User

原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/01/2797685.html

英文出自 http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

java程式語言允許你在一個類裡面再聲明另一個類,這樣的類成為嵌套類,說明如下:

class OuterClass {    ...    class NestedClass {        ...    }}

術語:嵌套類分為兩種:靜態或非靜態。嵌套類聲明為static稱為靜態嵌套類。非靜態嵌套類都稱為內部類。

class OuterClass {    ...    static class StaticNestedClass {        ...    }    class InnerClass {        ...    }}

一個嵌套類是它的封裝類的成員。非靜態嵌套類可以訪問它的封裝類的其他成員,即使這些成員聲明是private。靜態嵌套類不能訪問封裝類的其他成員。就像外部類的一個成員一樣,嵌套類可以聲明為private,public,protected,包內私人(回顧外部類只能聲明為public或者是包內私人)

 

為什麼使用嵌套類

使用嵌套類,其中有幾個令人信服的理由:

  • 它是一個在一個地方使用類的邏輯分組的方法
  • 它加強封裝
  • 嵌套類可以促進更可讀性,可維護性的代碼。

類的邏輯分組—如果一個類只是被其他一個類使用,那麼合乎邏輯的是把它嵌套到該類,讓這兩個類在一起。嵌套這樣的協助類可以讓包更加精簡。

加強封裝—考慮兩個頂級類,A和B,如果B需要訪問A的private成員,通過在A類隱藏B類,那麼即使A的成員聲明為private,那麼B也可以訪問它們。更多的是,B本身也可以隱藏於外部。

更可讀性,可維護性的代碼—在頂級類裡嵌套小類,讓代碼更靠近使用的地方。

 

 

靜態嵌套類

和類方法,類變數一樣,一個靜態嵌套類是和它的外部類關聯的。就像靜態類方法一樣,一個靜態嵌套類不能直接引用封裝類的執行個體變數或者方法—它只能通過封裝類的引用訪問它們。

注意:一個靜態嵌套類訪問它的封裝類(和其他類)的執行個體成員,就像訪問其他頂級類一樣。事實上,一個靜態嵌套類就像一個頂級類,只是行為上嵌套在另一個頂級類裡而已,達到打包方便的目的。

靜態嵌套類是使用封裝類的名字訪問:

OuterClass.StaticNestedClass

例如,建立一個靜態嵌套類的對象,文法是:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

 

內部類

如執行個體方法和執行個體欄位一樣,一個內部類是和封裝類的執行個體關聯的,並且可以直接存取這個對象的成員和方法。正是因為一個內部類是和執行個體關聯的,所以它不能定義任何靜態成員。

內部類的對象執行個體存在於外部類的執行個體,考慮下面的類:

class OuterClass {    ...    class InnerClass {        ...    }}

一個內部類的執行個體,盡可以存在於外部類的執行個體中,並且可以直接存取封裝執行個體的方法和欄位。說明了這個想法:

 

 

一個內部類的執行個體存在於外部類的執行個體

執行個體化內部類之前,你首先要執行個體化外部類。然後基於外部類的對象建立內部類對象,文法是:

還有,有兩種特別的內部類,局部類和匿名類(也可以成為匿名內部類)。這兩者會在後面討論。

 

內部類例子

為了示範內部類的使用,讓我們思考一個數組。接下來的例子,我們會建立一個數組,填充為整數,輸出的數組的索引值是升序的。

下面的DataStructure類包括:

  • DataStructure外部類,包含了添加整數到內部數組的方法,輸出數組裡的索引值
  • InnerEvenIterator內部類,類似java的標準迭代器。迭代器用於遍曆一個資料結果,典型的是判斷是否到了最後一個元素,檢索當前元素,移動到下一個元素。
  • 在main方法裡執行個體化DataStructure對象,使用它填充數組arrayOfInts為一系列整數(0, 1, 2, 3, etc.),然後調用一個printEven 方法,輸出arrayOfInts的索引值。
public class DataStructure {    // create an array    private final static int SIZE = 15;    private int[] arrayOfInts = new int[SIZE];        public DataStructure() {        // fill the array with ascending integer values        for (int i = 0; i < SIZE; i++) {            arrayOfInts[i] = i;        }    }        public void printEven() {        // print out values of even indices of the array        InnerEvenIterator iterator = this.new InnerEvenIterator();        while (iterator.hasNext()) {            System.out.println(iterator.getNext() + " ");        }    }        // inner class implements the Iterator pattern    private class InnerEvenIterator {        // start stepping through the array from the beginning        private int next = 0;                public boolean hasNext() {            // check if a current element is the last in the array            return (next <= SIZE - 1);        }                public int getNext() {            // record a value of an even index of the array            int retValue = arrayOfInts[next];            //get the next even element            next += 2;            return retValue;        }    }        public static void main(String s[]) {        // fill the array with integer values and print out only        // values of even indices        DataStructure ds = new DataStructure();        ds.printEven();    }}

輸出是:

0 2 4 6 8 10 12 14 

注意InnerEvenIterator是直接引用DataStructure對象的執行個體變數arrayOfInts。

內部類可用來實現協助類,就像上面的例子。如果你計劃處理使用者介面事件,你需要指導如何使用內部類,因為事件處理機制中,內部類是廣泛使用的。

 

局部和匿名內部類

有兩種良性的內部類。你可以在方法體內聲明一個內部類。這樣的類成為局部內部類。你也可以在方法體內,聲明一個沒有名字的內部類,這種類就是匿名內部類了。我們將會在java進階編程遇到它。

 

修飾符

可以為內部類使用修飾符,就像外部類成員那麼使用。例如,可以使用特殊訪問—private,public,protected—限制訪問內部類的方式,就像和其他類成員的使用方式一樣。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.