为什么类构造函数从未调用过?

时间:2014-09-17 13:34:28

标签: java constructor initialization

我对以下代码感到困惑,

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有点新,任何帮助都意味着很多,谢谢!

7 个答案:

答案 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()