Java Menginisialisasi larik int dalam konstruktor


91

Saya memiliki kelas dan di kelas itu saya memiliki ini:

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

Kemudian di konstruktor saya:

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

Jika saya melakukan ini, semuanya baik-baik saja. Nilai data default diinisialisasi tetapi jika saya melakukan ini:

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

Ia mengatakan:

Local variable hides a field

Mengapa?

Apa cara terbaik untuk menginisialisasi array di dalam konstruktor?


Saya harap Anda mengetahui konsep ruang lingkup variabel? variabel Anda datasetelah "//some code"memiliki ruang lingkup seluruh kelas. sedangkan variabel datadalam konstruktor memiliki ruang lingkup di dalam konstruktor. dan setelah konstruktor selesai, variabel akan dihancurkan. Dan juga datavariabel di dalam konstruktor menyembunyikan variabel dengan nama yang sama di kelas. Ini membenarkan kesalahanLocal variable hides a field
Naveen Babu

Jawaban:


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

Ini sudah menginisialisasi elemen array Anda ke 0. Anda tidak perlu mengulanginya lagi di konstruktor.

Dalam konstruktor Anda, seharusnya:

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

Iya. Ini adalah satu-satunya cara yang memungkinkan saya. Menempatkan hanya data; mengatakan bahwa "itu bukan pernyataan". Terima kasih
Favolas

Tidak bisakah dia menggunakan data=new int[3]di konstruktor defualt Date()?
parsecer

7

Anda bisa melakukan:

public class Data {
    private int[] data;

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

Yang menginisialisasi datadi konstruktor, atau:

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

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

Yang menginisialisasi datasebelum kode dalam konstruktor dijalankan.


Saya harus meletakkan data = new int [] {0,0,0}; di dalam konstruktor. Jika saya menginisialisasi sebelum kode di konstruktor hanya menempatkan data; di dalam konstruktor memberi saya kesalahan "bukan pernyataan"
Favolas

jika ada lebih dari juta elemen dalam array .. Anda ingin menggunakan kode pertama dan mengubah baris public Data() throws Error {jika OutOfMemoryErrorakan dibuang.
torehan

4

Ini karena, dalam konstruktor, Anda mendeklarasikan variabel lokal dengan nama yang sama sebagai atribut.

Untuk mengalokasikan array integer yang semua elemennya diinisialisasi ke nol, tulis ini di konstruktor:

data = new int[3];

Untuk mengalokasikan array integer yang memiliki nilai awal lainnya, letakkan kode ini di konstruktor:

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

atau:

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

4

mengapa tidak sederhana

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

alasan Anda mendapatkan kesalahan ini adalah karena int[] data = ...mendeklarasikan variabel baru dan menyembunyikan bidangdata

Namun perlu dicatat bahwa isi array sudah diinisialisasi ke 0 (nilai default int)


1

di konstruktor Anda, Anda membuat larik int lain:

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

Coba ini:

 data = {0,0,0};

CATATAN: Ngomong-ngomong, Anda TIDAK perlu menginisialisasi elemen array Anda jika dideklarasikan sebagai variabel instance. Variabel instance secara otomatis mendapatkan nilai defaultnya, yang untuk array integer, nilai defaultnya adalah nol.

Jika Anda memiliki array yang dideklarasikan secara lokal meskipun Anda perlu menginisialisasi setiap elemen.


0

Cara terbaik adalah tidak menulis pernyataan inisialisasi apa pun. Ini karena jika Anda menulis int a[]=new int[3]maka secara default, di Java semua nilai array ie a[0], a[1]dan a[2]diinisialisasi ke 0! Mengenai variabel lokal yang menyembunyikan kolom, posting seluruh kode Anda agar kami dapat menyimpulkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.