Java Initialisiert ein int-Array in einem Konstruktor

89

Ich habe eine Klasse und in dieser Klasse habe ich diese:

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

Dann in meinem Konstruktor:

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

Wenn ich das mache, ist alles in Ordnung. Standarddatenwerte werden initialisiert, aber wenn ich dies stattdessen tue:

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

Es sagt:

Local variable hides a field

Warum?

Wie kann ein Array im Konstruktor am besten initialisiert werden?

Favolas
quelle
Ich hoffe, Sie kennen das Konzept des Variablenumfangs? Ihre Variable datadanach "//some code"hat einen Gültigkeitsbereich der gesamten Klasse. während die Variable dataim Konstruktor einen Bereich innerhalb des Konstruktors hat. und sobald der Konstruktor fertig ist, wird die Variable zerstört. Außerdem dataversteckt die Variable im Konstruktor die gleichnamige Variable in der Klasse. Dies rechtfertigt den FehlerLocal variable hides a field
Naveen Babu

Antworten:

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

Dadurch werden Ihre Array-Elemente bereits auf 0 initialisiert. Sie müssen dies im Konstruktor nicht erneut wiederholen.

In Ihrem Konstruktor sollte es sein:

data = new int[]{0, 0, 0};
Bhesh Gurung
quelle
Ja. Dies war der einzige Weg, den es mir erlaubte. Nur Daten setzen; sagte, dass "es keine Aussage ist". Vielen Dank
Favolas
Kann er nicht data=new int[3]in defualt Konstruktor verwenden Date()?
Parsecer
7

Sie könnten entweder tun:

public class Data {
    private int[] data;

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

Was dataim Konstruktor initialisiert wird , oder:

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

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

Was initialisiert wird, databevor der Code im Konstruktor ausgeführt wird.

Pillingworth
quelle
Ich muss data = new int [] {0,0,0} setzen; im Konstruktor. Wenn ich vor dem Code im Konstruktor initialisiere und nur Daten setze; im Konstruktor gab mir "keine Aussage" Fehler
Favolas
Wenn das Array mehr als eine Million Elemente enthält, möchten Sie den ersten Code verwenden und die Zeile ändern, public Data() throws Error {wenn OutOfMemoryErrorsie ausgelöst wird.
Nick
4

Dies liegt daran, dass Sie im Konstruktor eine lokale Variable mit demselben Namen wie ein Attribut deklariert haben.

Um ein ganzzahliges Array zuzuweisen, bei dem alle Elemente auf Null initialisiert sind, schreiben Sie dies in den Konstruktor:

data = new int[3];

Fügen Sie diesen Code in den Konstruktor ein, um ein ganzzahliges Array mit anderen Anfangswerten zuzuweisen:

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

oder:

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

warum nicht einfach

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

Der Grund, warum Sie den Fehler erhalten haben, ist, dass int[] data = ...eine neue Variable deklariert und das Feld ausgeblendet wirddata

Es ist jedoch zu beachten, dass der Inhalt des Arrays bereits auf 0 initialisiert ist (der Standardwert von int).

Ratschenfreak
quelle
1

In Ihrem Konstruktor erstellen Sie ein weiteres int-Array:

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

Versuche dies:

 data = {0,0,0};

HINWEIS: Übrigens müssen Sie Ihre Array-Elemente NICHT initialisieren, wenn sie als Instanzvariable deklariert sind. Instanzvariablen erhalten automatisch ihre Standardwerte. Bei einem ganzzahligen Array sind die Standardwerte alle Nullen.

Wenn Sie ein Array lokal deklariert hätten, müssten Sie jedes Element initialisieren.

Mechkov
quelle
0

Der beste Weg ist, keine initialisierenden Anweisungen zu schreiben. Dies liegt daran , wenn Sie schreiben , int a[]=new int[3]dann standardmäßig in Java alle Werte des Arrays , dh a[0], a[1]und a[2]zu initialisiert werden 0! In Bezug auf die lokale Variable, die ein Feld verbirgt, veröffentlichen Sie Ihren gesamten Code, damit wir zum Schluss kommen.

Kameron
quelle