这种语法有区别吗?

时间:2013-01-11 10:54:26

标签: java arrays object

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:6)

假设你的意思

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

这样可以正常工作。

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

答案 1 :(得分:2)

这不是一回事:当你创建一个数组(它应该被声明为MyObject[]而不是MyObject)时,你只需要创建一个“占位符”,你就不要创建数组中的各个项目。并且在创建数组时,其元素最初为空,或者对于不同的基元类型为零。

在您的第一个示例中,您应该执行new MyObject()MyObject()单独无法使用(除非名称MyObject()中有方法当前类...返回类MyObject的实例。讨论混淆)。

因此,您的第二个代码将抛出NullPointerException(除非@Reimeus在其答案中提到,.someMethod()是类MyObject的静态方法)。

答案 2 :(得分:1)

abcd[0] = MyObject();

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

abcd[0] = new MyObject();

在Java中,对象永远不是变量或数组元素的直接值。如果没有该行,则每个数组元素只是null,因此您无法在不获取NullPointerException的情况下调用其中的任何方法。

如果您的someMethod是静态的,abcd[0].someMethod()行实际编译的内容就是

MyObject.someMethod();

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

答案 3 :(得分: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();

并且您将有一个NullPointerException,因为abdc[0]未初始化。 (你创建了数组,但没有放任何元素)。