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

Чому?

Який найкращий спосіб ініціалізувати масив усередині конструктора?


Сподіваюся, вам відоме поняття сфери дії змінної? ваша змінна dataafter "//some code"має обсяг усього класу. тоді як змінна dataв конструкторі має область дії всередині конструктора. і як тільки конструктор буде виконаний, змінна буде знищена. А також dataзмінна всередині конструктора приховує змінну з тим самим іменем у класі. Це виправдовує помилкуLocal variable hides a field
Naveen Babu

Відповіді:


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

Це вже ініціалізує ваші елементи масиву до 0. Вам не потрібно повторювати це ще раз у конструкторі.

У вашому конструкторі це повинно бути:

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

Так. Це був єдиний спосіб, який Це дозволило мені. Введення лише даних; сказав, що "це не заява". Дякую
Фаволас

Чи не може він використовувати 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до виконання коду в конструкторі.


Я повинен поставити 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! Щодо локальної змінної, яка приховує поле, опублікуйте весь свій код, щоб ми дійшли висновку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.