2013-10-04 23 views
1

我看過關於Java的Oracle Website的示例代碼嗎?Java中嵌套類的目的是什麼?

public class Parent { 
    class InnerClass { 
     void methodInFirstLevel(int x) { 
      // some code 
     } 
    } 

    public static void main(String... args) { 
     Parent parent = new Parent(); 
     Parent.InnerClass inner = parent.new InnerClass(); 
    } 
} 
  • 什麼是構建parent.new InnerClass()的目的是什麼?
  • 什麼樣的課程適合這樣的建設?

標題可能會引起誤解:我瞭解有關此構造的所有信息。

我只是不明白何時何地使用此Java功能。

我發現了另一個語法做同樣的:Java: Non-static nested classes and instance.super()

有很多的關於這個結構的引用,但沒有任何有關應用程序。

[參考文獻]

+0

一個很好的用法是爲Builder設計模式命名爲'Builder'的靜態內部類... – ppeterka

+0

官方的Java教程涵蓋了它們:http://docs.oracle.com/javase/tutorial/java/javaOO/nested .html –

+4

對於Java 8不是特定的,自第一個Java版本以來可能已經存在 –

回答

0

其它類內的嵌套類窩。一個普通的類是一個包,一個頂級類的直接成員。內部類,這成爲利用Java 1.1,有四種口味:

  • 靜態成員類
  • 成員類
  • 局部類
  • 匿名類

的最重要的特徵內部類是它允許你把東西變成你通常不會變成對象的對象。這可以讓你的代碼更加面向對象,而不用沒有內部類。

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(); 
    } 
} 
+2

這句話「可以讓你把事物變成通常不會變成物體的物體」,這對我來說並沒有什麼意義。 –

+0

請看我的編輯,用一個例子完美地說明這句話 – Heaven42

+0

我不明白這是怎麼說明這句話的;人們可能會想知道,如果在這裏創建一個迭代器是需要和想要的。 –

2

什麼是parent.new InnerClass()的目的是什麼?

這是爲了演示 - 使用這種機制來構造一個內部類是很少見的。通常情況下,內部類只能由外部類創建,只需像往常一樣使用new InnerClass()創建。

什麼樣的課程適合這樣的建設?

查看Map.Entry<K,V>的一個經典示例。在這裏你可以看到一個名爲Entry的內部類,它應該由所有實現Map的類創建。

+0

樣本中提供的結構需要在創建'InnerClass'實例之前創建一個'Parent'的實例。我不明白與Map.Entry的鏈接? – chepseskaf

+0

@chepseskaf - 對於非靜態的內部類,每一個都有一個到其父對象的連接,以便它可以訪問父對象的字段和方法,因此每個子對象都必須存在父對象**。將'Entry'類包含在'Map'類中是有意義的,因爲每種類型的'Map'都可能具有不同種類的'Entry'。 – OldCurmudgeon

+1

我在@chepseskaf旁邊,我們完全不知道內部非靜態類是什麼以及它與父類的關係。我們無法弄清楚爲什麼有人會實例化一個Parent,然後__從父實例中將InnerClass實例化。這與Map.Entry示例非常不同。什麼用例需要這樣的技術? – Pigelvy

1

我在這裏看到很多答案,解釋了內部類的使用,但據我所見,問題是關於具體構造parent.new InnerClass()

該語法的原因非常簡單:內部類的實例必須屬於周圍類的實例。但由於main是一種靜態方法,因此不存在圍繞Parent的對象。因此,您必須明確指定該對象。

public static void main(String[] args) { 
    // this results in an error: 
    // no enclosing instance of type Parent is available 
    InnterClass inner = new InnerClass(); 

    // this works because you specify the surrounding object 
    Parent parent = new Parent(); 
    InnerClass inner = parent.new InnerClass();  
} 

我正在尋找這種構造在標準包中的使用,但到目前爲止我還沒有找到一個例子。

+0

你似乎理解了這個問題,但你的答案都是關於技術本身,而不是這種技術的針對性/使用。 – Pigelvy

+1

@Pigelvy你是對的。原因是我沒有看到這種語法的用法。我提出的每個例子都可以在沒有它的情況下解決。 –