【问题标题】:What is the difference between using and not using `New` keyword to define an array? [duplicate]使用和不使用`New`关键字定义数组有什么区别? [复制]
【发布时间】:2015-07-08 06:46:48
【问题描述】:

看看这两个简单的程序:

方案一:

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

方案二:

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有什么区别吗? (有什么区别!)

【问题讨论】:

  • AFAIK,它们都编译成完全相同的字节码。
  • @immibis - 字节码相同。两者都调用newarray,但在创建数组的第一种方法中只能在初始化期间进行

标签: java


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    有一个很大的区别。前者只能在数组的初始化期间使用。 代码编译 如果你尝试使用像{1,2,3} 这样的数组常量表达式来初始化一个已经定义/声明的数组,那么代码编译将失败,后者可以随时使用。两种情况下的字节码都是相同的。

    【讨论】:

    • 但我可以arr = new int[15];
    • @Prashant - 是的。你可以,因为这不会创建一个数组常量。
    • 这不会改变创建的数组对象即{1,2,3},它只是改变arr的参考点
    • 我不会说“创造”了任何不同的东西。前一个 syntax 不能在声明之外使用,但对象没有什么不同。
    • 这个答案其实不是真的。当我们使用 new-less 版本创建数组时,创建的数组和引用都可以修改。尝试将“编译时错误”替换为arr[0] = 4
    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 2012-12-29
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多