Массивы с внешним и внутренним классами

Я относительно новичок в 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);
 }

Будет ли это работать?

5 ответов

Небольшое уточнение для ответа № 2, если у вас есть вложенные классы для хранения данных, означает, что у вас есть конструктор для внешнего класса, который автоматически генерирует переменное число членов массива для внутреннего класса, например древовидную структуру. Это решение - практически обходной путь, в котором используется один определенный член - ArrayList, который можно развернуть позже вместо прямого определения массива InnerClass[] внутри OuterClass, который не будет работать, если он не является статическим.

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

извне вы можете получить доступ к InnerClass Instances с помощью get:

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

Во-первых, я думаю, что вы должны научиться ходить, прежде чем начать бегать:

public Outerclass

должно быть

public class Outerclass

то же самое с внутренним!

Во-вторых, вся последняя часть вашего кода должна быть в main() метод ВНУТРИ нашего класса.

И в-третьих, нет, вы не можете использовать внутренний класс таким образом, поэтому эти классы являются внутренними. Если вы хотите использовать внутренние классы изнутри main() или извне внешнего класса вы должны использовать экземпляр external для доступа к ним, так же, как и к любому другому члену экземпляра - вы не можете получить к нему доступ напрямую:

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

Вот ключевые строки вашего кода:

 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.

Экземпляр внутреннего класса может существовать только внутри экземпляра внешнего класса. (Для различия между статическими и нестатическими внутренними классами, смотрите этот ответ для получения дополнительной информации).

Это означает, что вы создаете внутренние объекты внутри внешних объектов. Вы можете думать об этом как о внешних объектах, создающих и содержащих внутренние объекты (отсюда и название 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 как вы делаете, вы говорите, что он должен получить доступ к членам его OuterClass экземпляр, и, как вы можете видеть в своем коде, для каждого new InnerClass() Вы никогда не указываете, что является OuterClass пример для этого.

Другие вопросы по тегам