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

Java 使用和不使用'New'关键字定义数组有什么区别?,java,Java,看看这两个简单的程序: 方案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]; { my

看看这两个简单的程序:

方案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
之间是否有任何区别?(有什么不同!)

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

在第二个程序中,
{…}
不是数组分隔符,它们是块delimeters;在本例中,它们用于给出所谓的初始值设定项块,在实例化类的新实例时执行该块

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

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允许您在特定情况下保留
新字节[]
部分:


但是我可以做
arr=newint[15]@Prashant-是。您可以这样做,因为这不会创建数组常量。这不会更改所创建的数组对象,即{1,2,3},它只是更改arrI的引用点,不会说“创建”任何不同。前一种语法不能在声明之外使用,但是对象没有什么不同。这个答案实际上是不正确的。当我们使用新的less版本创建数组时,可以修改创建的数组和引用。尝试将“编译时错误”替换为
arr[0]=4
。好的,这两个都编译为完全相同的字节码。@immibis-字节码相同。这两种方法都调用
newarray
,但在第一种方法中,只有在初始化期间才能创建数组
byte[] myArray = { 1, 2, 3 };    // OK
myArray = { 4, 5, 6 };           // Does not compile
anObject.someMethod({ 7, 8, 9}); // Does not compile