Java Zainicjuj tablicę int w konstruktorze


91

Mam klasę iw tej klasie mam to:

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

Następnie w moim konstruktorze:

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

Jeśli to zrobię, wszystko jest w porządku. Domyślne wartości danych są inicjowane, ale jeśli zamiast tego zrobię to:

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

To mówi:

Local variable hides a field

Czemu?

Jaki jest najlepszy sposób na zainicjowanie tablicy wewnątrz konstruktora?


Mam nadzieję, że znasz pojęcie zakresu zmiennej? twoja zmienna datapo "//some code"ma zasięg całej klasy. podczas gdy zmienna dataw konstruktorze ma zakres wewnątrz konstruktora. a po zakończeniu konstruktora zmienna zostanie zniszczona. A także datazmienna wewnątrz konstruktora ukrywa zmienną o tej samej nazwie w klasie. To uzasadnia błądLocal variable hides a field
Naveen Babu,

Odpowiedzi:


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

To już inicjalizuje elementy tablicy na 0. Nie musisz tego powtarzać w konstruktorze.

W twoim konstruktorze powinno to być:

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

Tak. To był jedyny sposób, na jaki mi to pozwoliło. Umieszczanie tylko danych; powiedział, że „to nie jest oświadczenie”. Dzięki
Favolas,

Czy nie może użyć data=new int[3]w domyślnym konstruktorze Date()?
parsecer

7

Możesz zrobić:

public class Data {
    private int[] data;

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

Który inicjalizuje się dataw konstruktorze lub:

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

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

Który inicjuje się dataprzed wykonaniem kodu w konstruktorze.


Muszę wstawić data = new int [] {0,0,0}; wewnątrz konstruktora. Jeśli zainicjuję przed kodem w konstruktorze, wstawiam tylko dane; wewnątrz konstruktora wyświetlił mi się błąd „not a statement”
Favolas,

jeśli w tablicy jest więcej niż milion elementów ... chciałbyś użyć pierwszego kodu i zmienić linię, public Data() throws Error {jeśli OutOfMemoryErrorzostanie wyrzucony.
nick

4

Dzieje się tak, ponieważ w konstruktorze zadeklarowano zmienną lokalną o takiej samej nazwie, jak atrybut.

Aby zaalokować tablicę liczb całkowitych, w której wszystkie elementy są inicjalizowane na zero, zapisz w konstruktorze:

data = new int[3];

Aby zaalokować tablicę liczb całkowitych, która ma inne wartości początkowe, umieść ten kod w konstruktorze:

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

lub:

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

4

dlaczego nie po prostu

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

przyczyną błędu jest to, że int[] data = ... deklaracja nowej zmiennej i ukrycie poladata

jednak należy zauważyć, że zawartość tablicy jest już zainicjowana na 0 (wartość domyślna int)


1

w swoim konstruktorze tworzysz kolejną tablicę int:

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

Spróbuj tego:

 data = {0,0,0};

UWAGA: Nawiasem mówiąc, NIE musisz inicjować elementów tablicy, jeśli jest zadeklarowana jako zmienna instancji. Zmienne instancji automatycznie pobierają wartości domyślne, które w przypadku tablicy liczb całkowitych są zerami.

Gdybyś miał lokalnie zadeklarowaną tablicę, musiałbyś zainicjować każdy element.


0

Najlepszym sposobem jest nie pisać żadnych instrukcji inicjalizujących. Dzieje się tak, ponieważ jeśli zapiszesz int a[]=new int[3]to domyślnie, w Javie wszystkie wartości tablicy, tj. a[0], a[1]I a[2]zostaną zainicjalizowane na 0! Jeśli chodzi o zmienną lokalną ukrywającą pole, opublikuj cały kod, abyśmy mogli dojść do wniosku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.