我对Java比较陌生。我想创建一个外部类的arraylist,并且对于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);
}
这会有用吗?
答案 0 :(得分:1)
首先,我认为你应该在开始跑步之前学会如何走路:
public Outerclass
应该是
public class Outerclass
与内心相同!
其次,代码的最后一部分应该是main()
方法INSIDE Ourclass。
第三,不,你不能像这样使用内部类,这就是为什么这些类是内在的。如果要在main()
内部或外部类外部使用内部类,则必须使用外部实例才能访问它们,就像访问任何其他实例成员一样 - 您无法直接访问它:
Outerclass oc = new Outerclass();
Outerclass.InnerClass in = oc.new InnerClass();
答案 1 :(得分:1)
对于答案#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
答案 2 :(得分: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
为InnerClass
,则无需这样做。但是static
是一个嵌套类而不是内部类......根据标准的Java术语。
答案 3 :(得分:0)
内部类的实例只能存在于外部类的实例中。 (有关静态和非静态内部类的区别,请参阅this answer以获取更多信息)。
这意味着您在外部对象中创建内部对象。您可以将其视为创建和包含内部对象的外部对象(因此名称为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 {
}
}
答案 4 :(得分: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
自行创建new
,您说它需要访问其OuterClass
实例的成员,并且您可以请参阅您的代码,对于每个new InnerClass()
,您永远不会以任何方式指定它的OuterClass
实例。