我对以下代码感到困惑,
package test;
public class Test {
FooC fooC = new FooC();
public static void main(String[] args) {
System.out.println("started");
Test t = new Test();
}
public class FooA {
public int[] mData;
public FooA() {
System.out.println("aa");
mData = new int[32];
}
}
public class FooB {
public FooA[] mFooA;
public FooB() {
System.out.println("bb");
mFooA = new FooA[12];
}
}
public class FooC {
public FooB mFooB;
public FooC() {
System.out.println("cc");
mFooB = new FooB();
}
}
}
运行时,输出为:
started
cc
bb
为什么FooA构造函数从未调用过?我对java有点新,任何帮助都意味着很多,谢谢!
答案 0 :(得分:7)
mFooA = new FooA[12];
- >您正在创建一个可以容纳12个FooA实例的数组。您尚未创建如下的FooA实例:new FooA()
答案 1 :(得分:4)
new FooA[12];
不创建和初始化FooA
类的实例,但是 12个FooA
实例的数组。此数组也没有自动填充FooA
的新实例(因此不调用构造函数),而是使用null
s。这个设计决定的几个原因是
答案 2 :(得分:1)
在Java中,当您调用new MyClass()
在你的代码中,当你调用mFooA = new FooA[12];
你真正在做的事情时,实例化一个数组,该数组可以容纳12个对FooA
个对象的引用,这些对象位于堆上的某个地方,但是你没有'实际上还实例化了任何FooA
个对象。
要做到这一点,你必须做mFooA[0] = new FooA();
答案 3 :(得分:0)
mFooA = new FooA[12];
//这里你创建了一个可以保存FooA
您应该创建FooA();
答案 4 :(得分:0)
这不是构建课程。
mFooA = new FooA[12];
您需要使用括号。
mFooA = new FooA();
如果在构造过程中需要FooA接受数组,请按以下方式定义:
public class FooA {
public int[] mData;
public FooA(int[] arr) {
System.out.println("aa");
mData = arr;
}
}
并实例化如下:
mFooA = new FooA(new int[12]);
答案 5 :(得分:0)
这是因为
mFooA = new FooA[12];
将仅创建数组的实例,而不是FooD实例。数组的每个元素最初都将为null,您可以单独创建每个实例。
答案 6 :(得分:0)
mFooA = new FooA[12];
这将创建一个数组。您必须将该数组的每个索引设置为新的FooA。
您应该将该行代码更改为:mFooA = new FooA()
。