0

我想知道是否在这两种情况下都创建了 MyObject 对象。如果不是,为什么这两种情况都能正常工作?

MyObject[] abcd = new MyObject[8];
abcd[0] = MyObject();
String str = abcd[0].someMethod();

MyObject[] abcd = new MyObject[8];
String str = abcd[0].someMethod();

我知道在第一个示例中,创建了一个包含 8 个元素的 MyObject 数组,并存储在该数组的引用变量 abcd 中。我有一个 MyObject 引用数组,但实际上没有 MyObject 对象。所以我创建了这些对象,第一个对象存储在数组 0 中。

在第二个例子中..是一样的,只是更短的代码?

*已编辑:忘记添加 [] 抱歉。*

4

4 回答 4

6

假设你的意思

MyObject[] abcd = new MyObject[8];
abcd[0] = new MyObject();
String str = abcd[0].someMethod();

这将正常工作。

第二个版本将抛出一个NullPointerException 除非 someMethod碰巧是static。在这种情况下,Java 不依赖为static要调用的方法创建的实例。

于 2013-01-11T10:59:02.123 回答
2

这不是一回事:当你创建一个数组时(它应该被声明为 a MyObject[],而不是 a MyObject),你只是创建了一个“占位符”,你不会在数组中创建单个项目。并且当创建一个数组时,它的元素一开始是空的,或者对于不同的原始类型来说为零。

在您的第一个示例中,您应该这样做new MyObject(),MyObject()单独将不起作用(除非当前类中有一个名称为方法...返回 class 的实例。谈论混淆)。MyObject()MyObject

结果,您的第二个代码将抛出一个NullPointerException(除非正如@Reimeus 在他的回答中提到的那样,.someMethod()是 class 的静态方法MyObject)。

于 2013-01-11T10:55:46.083 回答
1
abcd[0] = MyObject();

这不是有效的 Java 语法;看起来更像 C++。你需要

abcd[0] = new MyObject();

在 Java 中,对象永远不是变量或数组元素的直接值。没有那行,每个数组元素都是 just null,所以你不能在没有得到 的情况下调用它的任何方法NullPointerException

如果您someMethod是静态的,那么该行abcd[0].someMethod()实际编译成的只是

MyObject.someMethod();

编译器会忽略除表达式的静态类型以外的所有内容abcd[0],即MyObject. 这是 Java 语义的一个特例。

于 2013-01-11T10:56:58.597 回答
1
MyObject abcd = new MyObject[8];
abcd[0] = MyObject();
String str = abcd[0].someMethod();

这个片段不编译它应该是这样的

MyObject [] abcd = new MyObject[8];
abcd[0] = new MyObject();
String str = abcd[0].someMethod();

在这种情况下,您正在创建数组并将一个元素放在索引 0 处。

在你的第二种情况下:

MyObject abcd = new MyObject[8];
String str = abcd[0].someMethod();

它也没有编译,它应该是

MyObject []abcd = new MyObject[8];
String str = abcd[0].someMethod();

并且您将有一个 NullPointerExceptionabdc[0]未初始化。(您创建了数组,但没有在其中放入任何元素)。

于 2013-01-11T10:59:56.037 回答