为什么Java不初始化数组对象?

3
如果在Java中运行以下代码:
public class Testing {

    public static void main(String[] args) {
        TestObject[] array = new TestObject[4];
        //array[0] = new TestObject();
        System.out.println(Arrays.asList(array));
    }
}

class TestObject {
    String aString;

    public TestObject() {
        aString = "This has been initialized.";
    }
}

它将打印出(null,null,null,null),如果取消注释array [0] = new TestObject(); ,则第一个对象将具有内存地址(而不是null)。 我只是困惑为什么Java在数组首次正确初始化时不会自动调用每个对象的构造函数。 目前它工作的优点是什么? 它是空间问题吗(例如,这样做成本太高)?
也许我只是忽略了一些愚蠢的事情或者我简单地错了。 这与我遇到的问题无关,所以如果这是错误的论坛,我向您道歉。

2
如果您想填充包含TestObject子类或使用非默认构造函数构造的真实对象的数组会发生什么情况?在现实世界中,你很少需要一个只包含相同对象的数组。 - Paul Tomblin
3
它确实使它们初始化...只是到类型的默认值。如果使用子类型或非默认构造函数会迅速崩溃,否则就不是这种情况了。 - user166390
1
@AmirAfghani 如果你想要10个空字符串..由于List的大小[通常]可以改变,一般情况下不会向其中添加“空值”..(因为在大多数情况下,这可以用列表中缺少项目来表示)。无论如何,有各种Array.fill方法。 - user166390
1
我认为@AmirAfghani的观点是,用一堆相同的对象填充任何集合类几乎从来不是你想要的。为什么要创建你立即需要替换(和GC)的对象? - Paul Tomblin
1
或者构造函数可以是私有的,或者可能没有默认构造函数,或者... - tc.
显示剩余6条评论
2个回答

6

如果您想用TestObject的子类或使用非默认构造函数构造的真实对象来填充数组,会发生什么情况?在现实世界中,您很少希望有一堆相同的对象组成一个数组。


1
此外,并非所有对象都具有“默认构造函数”。 - Louis Wasserman

0

使用new TestObject[4]可以创建一个数组,其中可以存储4个对TestObject的引用。因此,要了解TestObject[]TestObject之间的区别:

TestObject[]是一个存储TestObject对象引用的引用仓库。如果你创建一个List<TestObject>,你也需要用引用填充列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接