2011-11-09 55 views
60

我有一个类,并在该类我有这样的:Java的初始化在构造函数int数组

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

然后在我的构造函数:

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

如果我这样做,一切都OK 。默认数据值初始化,但如果我不是这样做:

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

它说:

Local variable hides a field 

为什么?

什么是在构造函数中初始化数组的最佳方式?

感谢

+0

我希望你是知道的变量的作用域的概念?你的变量'data'在'“之后//”某个代码“'具有整个类的范围。而构造函数中的变量'data'在构造函数中有一个作用域。一旦构造函数完成,变量将被销毁。此外,构造函数中的data变量在类中隐藏了相同名称的变量。这证明错误'本地变量隐藏字段' –

回答

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

这已经初始化您的数组元素为0.您不需要再次在构造函数中重复。

在你的构造应该是:

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

是的。这是它允许我的唯一方式。只输入数据;说“它不是一个声明”。谢谢 – Favolas

+0

不能在defualt的构造函数Date()中使用'data = new int [3]'? – parsecer

4

何不干脆

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

你有原因的错误是因为int[] data = ...声明一个新的变量和隐藏领域data

然而,应该指出的是内容阵列已经初始化为0(默认值为int

0

在构造函数要创建另一个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!关于隐藏字段的局部变量,请发布您的整个代码,以便我们得出结论。

6

你既可以做

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

+0

我必须把data = new int [] {0,0,0};在构造函数中。如果我在构造函数中的代码之前初始化仅放入数据;在构造函数中给了我“不是一个语句”错误 – Favolas

+0

如果数组中有超过百万的元素..你想使用第一个代码并改变行'public Data()throws Error {'如果将抛出OutOfMemoryError。 –

4

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

要分配的所有元素初始化为零的整数数组,在构造写:

data = new int[3]; 

要分配其具有其它的初始值整数数组,把这个代码在构造:

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

或:

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