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

时间:2015-04-29 06:33:40

标签: 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];
    {
        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之间是否有任何区别? (任何差异!)

2 个答案:

答案 0 :(得分:2)

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

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

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 :(得分:1)

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