Java在构造函数中初始化一个int数组


90

我有一堂课,在那堂课我有:

 //some code
 private int[] data = new int[3];
 //some code

然后在我的构造函数中:

public Date(){
    data[0] = 0;
    data[1] = 0;
    data[2] = 0;
}

如果这样做,一切正常。默认数据值已初始化,但如果我改为这样做:

public Date(){
    int[] data = {0,0,0};
}

它说:

Local variable hides a field

为什么?

在构造函数内部初始化数组的最佳方法是什么?


希望您知道变量范围的概念吗?您的变量具有整个类的作用域data之后"//some code"。而data构造函数中的变量在构造函数内部具有作用域。一旦构造函数完成,变量将被销毁。data构造函数中的变量也将变量隐藏在类中。这证明了错误的理由Local variable hides a field
Naveen Babu

Answers:


178
private int[] data = new int[3];

这已经将您的数组元素初始化为0。您无需在构造函数中再次重复该操作。

在您的构造函数中,它应该是:

data = new int[]{0, 0, 0};

是。这是它允许我的唯一方法。只放入数据;说“这不是声明”。谢谢
Favolas 2011年

他不能data=new int[3]在默认构造函数中使用Date()吗?
parsecer

7

您可以这样做:

public class Data {
    private int[] data;

    public Data() {
        data = new int[]{0, 0, 0};
    }
}

data在构造函数中初始化的对象,或:

public class Data {
    private int[] data = new int[]{0, 0, 0};

    public Data() {
        // data already initialised
    }
}

data在构造函数中的代码执行之前初始化。


我必须把数据= new int [] {0,0,0}; 在构造函数中。如果我在构造函数中的代码之前进行初始化,只放入数据;构造函数内部给我“不是声明”错误
Favolas 2011年

如果数组中有超过一百万个元素..您想使用第一个代码并更改行(public Data() throws Error {如果OutOfMemoryError将被抛出)。
尼克

4

这是因为在构造函数中,您声明了一个与属性名称相同的局部变量。

要分配一个将所有元​​素都初始化为零的整数数组,请将其写入构造函数中:

data = new int[3];

要分配具有其他初始值的整数数组,请将以下代码放入构造函数中:

int[] temp = {2, 3, 7};
data = temp;

要么:

data = new int[] {2, 3, 7};

4

为什么不简单

public Date(){
    data = new int[]{0,0,0};
}

您收到错误的原因是因为int[] data = ...声明了一个新变量并隐藏了该字段data

但是请注意,数组的内容已经初始化为0(的默认值int


1

在构造函数中,您正在创建另一个int数组:

 public Date(){
  int[] data = {0,0,0};
  }

试试这个:

 data = {0,0,0};

注意:顺便说一句,如果声明为实例变量,则无需初始化数组元素。实例变量自动获取其默认值,对于整数数组,默认值全为零。

如果您有本地声明的数组,则需要初始化每个元素。


0

最好的方法是不要编写任何初始化语句。这是因为,如果你写 int a[]=new int[3]在默认情况下,然后,在Java中所有阵列即的值a[0]a[1]a[2]初始化为0!关于隐藏字段的局部变量,请发布您的完整代码,以便我们得出结论。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.