1

私はJavaに比較的慣れていません。外部クラスの配列リストを作成したかったのですが、配列リストの外部クラスのインデックスごとに、内部クラスの配列リストが必要です。

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);
 }

これは機能しますか?

4

5 に答える 5

1

まず、走り始める前に歩き方を学ぶべきだと思います。

public Outerclass

する必要があります

public class Outerclass

インナーと同じ!

次に、コードの最後の部分はすべてmain()メソッド INSIDE Ourclass 内にある必要があります。

そして第三に、いいえ、そのような内部クラスを使用することはできません。それが、これらのクラスが内部である理由です。外部クラスの内部または外部から内部クラスmain()を使用する場合は、他のインスタンスメンバーにアクセスするのと同じように、それらにアクセスするために外部のインスタンスを使用する必要があります-直接アクセスすることはできません:

        Outerclass oc = new Outerclass();
        Outerclass.InnerClass in = oc.new InnerClass();
于 2013-08-05T00:28:09.260 に答える
0

コードの重要な行は次のとおりです。

 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. の場合、これも必要InnerClassありstaticません。しかしInnerClass、標準のJava用語によると、内部クラスではなくネストされたクラスです。

于 2013-08-05T00:20:51.590 に答える
0

内部クラスのインスタンスは、外部クラスのインスタンス内にのみ存在できます。(静的内部クラスと非静的内部クラスの違いについては、詳細についてこの回答を参照してください)。

これが意味することは、外側のオブジェクト内に内側のオブジェクトを作成するということです。これは、内部オブジェクトを作成して含む外部オブジェクトと考えることができます (したがって、名前が付けられています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 {

    }
}
于 2013-08-05T00:22:37.703 に答える
0

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に、それ自体で作成することはできません。あなたは、そのインスタンスのメンバーにアクセスする必要があると言っています。コードでわかるように、インスタンスが何であるかを決して指定していませんそれのための。newOuterClassnew InnerClass()OuterClass

于 2013-08-05T00:35:25.727 に答える