[英]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 。
笔记:
如果创建内部类的代码是在外部类的实例的上下文中(例如,在外部类的实例方法中),则您不需要像这样限定new
类。
如果InnerClass
是static
则也没有必要。 但是根据标准的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.