У меня есть класс, и в этом классе у меня есть следующее:
//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
Ответы:
private int[] data = new int[3];
Это уже инициализирует элементы массива до 0. Вам не нужно повторять это снова в конструкторе.
В вашем конструкторе должно быть:
data = new int[]{0, 0, 0};
источник
data=new int[3]
в конструкторе defualtDate()
?Вы можете сделать:
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
перед выполнением кода в конструкторе.источник
public Data() throws Error {
еслиOutOfMemoryError
будет выброшено.Это потому, что в конструкторе вы объявили локальную переменную с тем же именем, что и атрибут.
Чтобы выделить целочисленный массив, все элементы которого инициализированы нулем, напишите это в конструкторе:
data = new int[3];
Чтобы выделить целочисленный массив с другими начальными значениями, поместите этот код в конструктор:
int[] temp = {2, 3, 7}; data = temp;
или:
data = new int[] {2, 3, 7};
источник
почему бы просто не
public Date(){ data = new int[]{0,0,0}; }
причина, по которой вы получили ошибку, заключается в том, что
int[] data = ...
объявляет новую переменную и скрывает полеdata
однако следует отметить, что содержимое массива уже инициализировано до 0 (значение по умолчанию
int
)источник
в своем конструкторе вы создаете еще один массив int:
public Date(){ int[] data = {0,0,0}; }
Попробуй это:
data = {0,0,0};
ПРИМЕЧАНИЕ. Кстати, вам НЕ нужно инициализировать элементы массива, если он объявлен как переменная экземпляра. Переменные экземпляра автоматически получают свои значения по умолчанию, которые для целочисленного массива все значения по умолчанию равны нулю.
Если бы у вас был локально объявленный массив, хотя вам нужно было бы инициализировать каждый элемент.
источник
Лучший способ - не писать никаких инициализирующих операторов. Это происходит потому , что если вы пишете ,
int a[]=new int[3]
то по умолчанию в Java все значения массива , т.е.a[0]
,a[1]
иa[2]
инициализируются0
! Что касается локальной переменной, скрывающей поле, опубликуйте весь свой код, чтобы мы пришли к заключению.источник