Java инициализировать массив int в конструкторе

91

У меня есть класс, и в этом классе у меня есть следующее:

 //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
Навин Бабу

Ответы:

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

Это уже инициализирует элементы массива до 0. Вам не нужно повторять это снова в конструкторе.

В вашем конструкторе должно быть:

data = new int[]{0, 0, 0};
Бхеш Гурунг
источник
Да. Это был единственный способ, которым Это позволяло мне. Ввод просто данных; сказал, что «это не заявление». Спасибо
Favolas 09
Разве он не может использовать data=new int[3]в конструкторе defualt Date()?
парсер
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перед выполнением кода в конструкторе.

Pillingworth
источник
Я должен поставить data = new int [] {0,0,0}; внутри конструктора. Если я инициализирую перед кодом в конструкторе, помещая только данные; внутри конструктора я получил ошибку «не утверждение»
Фаволас
если в массиве более миллиона элементов .. вы хотите использовать первый код и изменить строку, public Data() throws Error {если OutOfMemoryErrorбудет выброшено.
nick
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! Что касается локальной переменной, скрывающей поле, опубликуйте весь свой код, чтобы мы пришли к заключению.

Камерон
источник