当前位置: 首页 > 面试题库 >

为什么数组常量只能在初始化程序中使用?

嵇光临
2023-03-14
问题内容

我正在研究数组,并且经历了这种在一行中声明和初始化数组的捷径。例如,

int[] a = {1, 2, 3, 4, 5};

但是,当我尝试执行以下代码时,出现此编译器错误,提示“数组常量只能在初始化程序中使用”。

int[] a;
a = {1, 2, 3, 4};

为什么这样?


问题答案:

这是不允许的,因为JLS这么说。仅在声明和数组创建表达式中才允许使用该语法。

后者提供了获得相同结果的另一种方法

int[] a;
a = new int[]{1, 2, 3, 4};

至于需要的实际根本原因new T[],我的猜测如下。考虑以下数组初始化器:

{1, 2, 3, 4}

它可以用于初始化不同类型的数组:

new int[]{1, 2, 3, 4};
new float[]{1, 2, 3, 4};
new double[]{1, 2, 3, 4};

如果new T[]不需要该位,我怀疑裸露的内容{1, 2, 3, 4}可能会在语义分析期间造成困难。在这里,我正在考虑以下情况:

void f(float[] x) { ... }
void f(double[] x) { ... }
void g() {
  f({1, 2, 3, 4});
}

如果允许使用此语法,则语言规范将必须处理选择要调用的函数的复杂性。

同样,不清楚的类型应该是什么{null}。它可以是Object[]Integer[]Serializable[]等。

最后,空数组{}将是最棘手的。在这里,我们甚至无法分辨它是对象数组还是标量数组。

语言设计人员似乎并没有解决所有这些复杂问题,而是选择通过要求new T[]语法来避免它们。



 类似资料:
  • 问题内容: 考虑: 如何做到这一点,以便可以从其他方法调用数组? 问题答案: 这意味着您必须像这样初始化它: 如果要使用数组初始化器,则不能拆分声明和赋值。

  • 第一行代码是什么意思?它如何调整数组大小?第二行代码如何初始化该字节数组(如果是)?

  • 问题内容: 我正在努力理解为什么我在使用Swift的iOS项目中遇到此编译器错误。如果我创建以下类: 我在“初始化前使用了变量’self.c’” 这一行上收到编译器错误。 起初我以为这是因为编译器无法验证该方法是否无法访问,但是后来我尝试将init方法混入一点: 这次的错误是“在初始化之前使用了变量’self.b’”(在同一行上)。这表明编译器 是 能够检查其性能的方法访问,所以据我可以看到应该有

  • 我有一个静态矩阵结果和静态矩阵添加方法以及一个静态矩阵显示(用于打印结果),我在主函数中编写了一个测试示例。 我的目标是:我想用这两种静态方法乘和加两个矩阵。 我得到这些错误"变量C和d可能没有被初始化"。有人能告诉我,问题是什么吗?

  • 问题内容: 我得到错误: TestCounter.java:115:变量计数器可能尚未初始化counters [i] = new Counter(i); 而且我不知道如何解决它。我知道我的课程“” 有效。下面是我的代码,如果您可以看一下,我将非常高兴。此代码包装在类的main方法中。 问题答案: 您尚未创建数组,只是声明了变量。 您需要这样做: 或类似的东西

  • 问题内容: Java的设计者是否有任何理由认为不应为局部变量提供默认值?认真地讲,如果实例变量可以被赋予默认值,那为什么我们不能对局部变量做同样的事情呢? 问题答案: 声明局部变量主要是为了进行一些计算。因此,程序员决定设置变量的值,并且不应采用默认值。如果程序员错误地没有初始化局部变量并且使用默认值,则输出可能是一些意外值。因此,在使用局部变量的情况下,编译器将要求程序员在访问变量之前使用一些值