Массивы с внешним и внутренним классами
Я относительно новичок в 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.
Заметки:
Если код, который создает внутренний класс, находится в контексте экземпляра внешнего класса (например, он находится в методе экземпляра внешнего класса), тогда вам не нужно указывать
new
как это.Если
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
пример для этого.