整数数组的静态初始化

19

哪两个代码片段可以正确地创建和初始化一个int元素的静态数组? (选择两个。)

A.

static final int[] a = { 100,200 };
static final int[] a;
static { a=new int[2]; a[0]=100; a[1]=200; }
C.
static final int[] a = new int[2]{ 100,200 };

这段内容没有上下文或其他信息,因此无法进行有效的翻译。请提供更多详细信息,以便我能够更好地理解您的需求并为您提供准确的翻译。
static final int[] a;
static void init() { a = new int[3]; a[0]=100; a[1]=200; }

答案:A,B。

即使 D 也是正确的,有人能告识我为什么 D 是错误的吗?


1
这不是有效的Scheme、Ruby、Python或LISP代码。请格式化您的代码并指定您正在使用的语言/框架。 - leppie
2
你可能需要更改标题,以便实际上总结问题。 - Tim Barrass
5个回答

27

正确答案为1和2(或使用你的符号表示为A和B),另外一个正确的解决方案是:

static final int[] a = new int[]{ 100,200 };

方案 D 不会自动初始化数组,因为类是由运行时加载的。它只定义了一个静态方法(init),在使用数组字段之前必须调用该方法。


6
D定义了一个静态方法来初始化a,但并没有实际调用它。因此,除非有人显式地调用init方法,否则a将保持未初始化状态。
正如其他答案所指出的那样:D甚至不应该编译,因为它试图给final变量a赋值。我猜这是一个更正确的解释。尽管如此,即使a不是final,D仍然需要额外的代码才能工作。
我认为在D中的new int[3]是一个打字错误?其他三个都尝试创建长度为2的数组。

你说得很正确。我在Scjp中找到了答案,你的解释是正确的。不要在意投票。 - user516108

3

D (4)是错误的,因为a) a是final的,在init中无法赋值; b) 不能保证init会被调用; c) init没有设置第三个元素;


2
为什么这个回答会被踩?它完全是正确的。 - Cameron Skinner
我不是那个给你点踩的人,但我认为这并不完全正确。根据我的记忆,c) 是错误的,因为 new int[3] 会将所有元素初始化为零。如果我错了,请纠正我。 - Sergei Tachenov
@Sergey,你没有错,我只是顺便提了一下,因为我认为(在某个地方提到过)new int[3];应该是int[2];。导致D错误的主要原因是a是final的。 - khachik
Sergey C 是错误的。但不是因为你的原因。实际上,你可以初始化一个数组并且不提及其维度,或者你可以为一个数组创建一个特定的维度并稍后进行初始化。但是你不能同时初始化一个数组和指定其维度。无论如何,感谢您的参与。Ratna也提到了同样的事情。 - user516108

1

对于代码片段 C,您无法在初始化时指定维度(大小)。 对于代码片段 D,您应该初始化最终变量。它不能在以后被初始化。


0

在构造函数调用完成之前应该初始化final变量。由于“static void init()”是一个方法,它不会在构造函数之前运行,因此final变量将不会被初始化。因此,这是编译时错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接