使用和不使用`New`关键字来定义数组有什么区别?

看看这两个简单的程序:

计划1:

public class GenArray extends Applet { byte[] myArray ={ (byte) 'M', (byte) 'o', (byte) 'd', (byte) 'e', (byte) '1' }; } 

计划2:

 public class GenArray extends Applet { byte[] myArray = new byte[5]; { myArray[0] =(byte) 'M'; myArray[1] =(byte) 'o'; myArray[2] =(byte) 'd'; myArray[3] =(byte) 'e'; myArray[4] =(byte) '1'; } } 

我想知道Program-1的最后一行中的MyArray和Program-2的最后一行中的MyArray之间是否有任何区别? (任何差异!)

在你的第二个程序中, { ... }不是数组分隔符,它们是块delimetes; 在这种情况下,它们用于提供所谓的初始化块,该块在实例化类的新实例时执行。

创建初始化数组的“正确”方法是:

 new byte[] { 1, 2, 3 }; 

无论是在初始化引用时还是在使用现有引用时,或者将数组传递给方法时,都可以使用它:

 byte[] myArray = new byte[] { 1, 2, 3 }; // OK myArray = new byte[] { 4, 5, 6 }; // OK anObject.someMethod(new byte[] { 7, 8, 9}); // OK 

但是,第一个变体非常常见,因此Java允许您在该特定情况下保留new byte[]部分:

 byte[] myArray = { 1, 2, 3 }; // OK myArray = { 4, 5, 6 }; // Does not compile anObject.someMethod({ 7, 8, 9}); // Does not compile 

很大的不同。 前者只能在数组初始化期间使用。 如果您尝试使用类似{1,2,3}的数组常量表达式初始化已定义/声明的数组,则代码编译将失败。后者可以随时使用。 两种情况下的字节码都相同。