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?


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};

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.


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};

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).


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.