我想知道在两种情况下是否都创建了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中。
在第二个例子中..它是一样的,只是更短的代码吗?
* 已编辑:忘记添加[]我道歉。 *
答案 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]
未初始化。
(你创建了数组,但没有放任何元素)。