Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这种语法有区别吗?_Java_Arrays_Object - Fatal编程技术网

Java 这种语法有区别吗?

Java 这种语法有区别吗?,java,arrays,object,Java,Arrays,Object,我想知道在这两种情况下是否都创建了MyObject对象。如果不是,为什么这两种情况都很好 MyObject[] abcd = new MyObject[8]; abcd[0] = MyObject(); String str = abcd[0].someMethod(); 及 我知道在第一个示例中,一个MyObject数组由8个元素创建,并存储在该数组的引用变量abcd中。我有一个MyObject引用数组,但实际上没有MyObject对象。所以我创建了这些对象,第一个对象存储在数组0中 在第二

我想知道在这两种情况下是否都创建了MyObject对象。如果不是,为什么这两种情况都很好

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

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

在第二个例子中。。这是同一件事,只是短代码


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

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

在第一个示例中,您应该执行
new MyObject()
MyObject()
单独使用将不起作用(除非当前类中有一个名为
MyObject()
的方法,该方法返回类
MyObject
的实例。请谈谈混淆)

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

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

abcd[0] = new MyObject();
在Java中,对象永远不是变量或数组元素的直接值。如果没有这一行,每个数组元素都只是
null
,因此如果不获得
NullPointerException
,就无法对其调用任何方法

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

MyObject.someMethod();
编译器将忽略所有内容,但表达式的静态类型
abcd[0]
,即
MyObject
。这是Java语义的一个特例。

假设您的意思是

MyObject[] abcd = new MyObject[8];
abcd[0] = new MyObject();
String str = abcd[0].someMethod();
这很好用

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

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();
由于
abdc[0]
未初始化,您将有一个NullPointerException。
(您创建了数组,但没有在其中放入任何元素)。

abcd[0]=MyObject()?它可以编译吗?我想它应该是
新的MyObject()
。你确定第一个代码可以编译吗?第二部分将编译,但会抛出一个NPE。第一行也不应该编译。@NiklasR nice spot,第一眼就没发现这个怪癖!是的,这就是我的意思,对不起。谢谢你的解释。对somethod();对我来说是静态的。为什么它只适用于静态方法?@ElmedinZelenkic因为静态方法不需要一个实例来“运行”,它们只需要类,它“总是”在那里。JVM知道数组的类型是
MyObject
,因此该代码相当于编写
MyObject.someMethod()
。感谢您的修复。这正是我的意思。但更进一步。。为什么第二个示例仅适用于静态方法?
MyObject abcd = new MyObject[8];
String str = abcd[0].someMethod();
MyObject []abcd = new MyObject[8];
String str = abcd[0].someMethod();