簡體   English   中英

具有內部和外部類的數組

[英]Arrays with outer and inner classes

我對Java比較陌生。 我想創建一個外部類的arraylist,對於該數組列表的外部類的每個索引,我想要一個內部類的arraylist。

public Outerclass{

    //Code Here

    public InnerClass{
    //Code Here
    }
}

//My attempt at setting up the arrays
public ArrayList <Outerclass> olist;
public ArrayList <InnerClass> ilist;


 olist= new ArrayList<Outerclass>();
 for (int i = 0; i < 3; i++) {
      Outerclass c = new Outerclass ();
      ilist = new ArrayList<InnerClass>();
      for(int j = 0 ; j < 4; j++){
          InnerClass e = new InnerClass();
          ilist.add(e);
      }
      olist.add(c);
 }

這樣行嗎?

首先,我認為您應該在開始跑步之前學習如何走路:

public Outerclass

應該

public class Outerclass

與內心一樣!

其次,代碼的所有最后部分應位於INSIDE Ourclass的main()方法中。

第三,不,您不能使用這樣的內部類,這就是為什么這些類是內部的。 如果要在main()內部或外部類外部使用內部類,則必須使用外部實例才能訪問它們,就像訪問任何其他實例成員一樣,您不能直接訪問它:

        Outerclass oc = new Outerclass();
        Outerclass.InnerClass in = oc.new InnerClass();

如果您有嵌套的類用於數據存儲,則對答案2的細化改進意味着您擁有一個外部類的構造函數,該構造函數會自動為內部類生成可變數量的數組成員,例如樹結構。 實際上,此解決方案是一種變通方法,它使用一個定義的成員ArrayList,可以稍后對其進行擴展,而不是直接對OuterClass內部的InnerClass []數組進行定義,如果該數組不是靜態的,則該數組將不起作用。

public class OuterClass
{
    private int NumberInnerClassInstances;       
    // ... other members of OuterClass
    ArrayList<InnerClass> innerClassInstances = new ArrayList<>();

    OuterClass( input vars ...)  {
        // calculate the NumberInnerClassInstances needed
        for(int i = 0 ; j < NumberInnerClassInstances; i++) {
            OuterClass.InnerClass in = this.new InnerClass(i);
            innerClassInstances.add(in);
        }
    }

    public class InnerClass
    {
        int icvar;
        InnerClass(int i) {
            //...construct the Inner Class Member #i
            // can access the members of OuterClass
        }
    }
}

從外部,您可以使用get訪問InnerClass實例:

oc = new OuterClass( vars ...)
var = oc.InnerClassInstances.get(i).icvar

這是代碼的關鍵所在:

 Outerclass c = new Outerclass ();

     InnerClass e = new InnerClass();

那行不通。 您將得到一個編譯錯誤。

由於InnerClass是內部類,因此需要在其封閉類的實例(即OuterClass )的上下文中實例化它。 像這樣:

 Outerclass c = new Outerclass ();

     InnerClass e = c.new InnerClass();

c.new ...表單稱為合格的類實例創建表達式 參見JLS 15.9

筆記:

  1. 如果創建內部類的代碼是在外部類的實例的上下文中(例如,在外部類的實例方法中),則您不需要像這樣限定new類。

  2. 如果InnerClassstatic則也沒有必要。 但是根據標准的Java術語, InnerClass是一個嵌套類而不是內部類。

內部類的實例只能存在於外部類的實例中。 (有關靜態內部類和非靜態內部類的區別,請參閱此答案以獲取更多信息)。

這意味着您外部對象內創建內部對象。 您可以將其視為創建並包含內部對象的外部對象(因此,名稱為inner

這是一個例子:

import java.util.ArrayList;

public class OuterClass {
    static ArrayList<InnerClass> innerClasses = new ArrayList<InnerClass>();

    public static void main(String[] args) {
        OuterClass oc1 = new OuterClass();
        OuterClass.InnerClass ic1 =  oc1.new InnerClass();
        OuterClass.InnerClass ic2 =  oc1.new InnerClass();
        innerClasses.add(ic1);
        innerClasses.add(ic2);      
        System.out.println(innerClasses.size());
    }
    class InnerClass {

    }
}

鑒於InnerClass需要保持參照成員OuterClass ,我不知道你為什么不把ArrayList<InnerClass>里面OuterClass 如果他們以這種方式正在由它更有道理由具有列表“管理” OuterClass ,只是給它訪問方法返回的列表InnerClass情況等。

所以像這樣:

public class OuterClass
{
   private List<InnerClass> innerClassInstances = new ArrayList<>;

   public void addInnerInstances(int count)
   {
      for(int j = 0 ; j < count; j++)
      {
         InnerClass e = new InnerClass();
         innerClassInstances.add(e);
      }
   }

   public List<InnerClass> getInnerClassInstances()
   {
       return innerClassInstances;
   }

   public class InnerClass
   {
     //...
   }
}

   //in your main class or wherever
   List<Outerclass> olist;

   olist= new ArrayList<Outerclass>();
   for (int i = 0; i < 3; i++) 
   {
      Outerclass c = new Outerclass ();
      c.addInnerInstances(4);
      olist.add(c);
   }

您不能在執行操作時InnerClass使用new創建InnerClass ,而是說它需要訪問其OuterClass實例的成員,並且正如您在代碼中所看到的那樣,對於每個new InnerClass()您都new InnerClass()指定無論如何, OuterClass實例是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM