Membuat array objek di Jawa

196

Saya baru ke Jawa dan untuk saat ini membuat array objek di Jawa.

Saya punya kelas A misalnya -

A[] arr = new A[4];

Tapi ini hanya membuat pointer (referensi) ke Adan bukan 4 objek. Apakah ini benar? Saya melihat bahwa ketika saya mencoba mengakses fungsi / variabel dalam objek yang dibuat saya mendapatkan pengecualian pointer nol. Untuk dapat memanipulasi / mengakses objek saya harus melakukan ini:

A[] arr = new A[4];
for (int i = 0; i < 4; i++) {
    arr[i] = new A();
}

Apakah ini benar atau saya melakukan sesuatu yang salah? Jika ini benar itu benar-benar aneh.

EDIT: Saya menemukan ini aneh karena di C ++ Anda baru saja mengatakan baru A[4]dan itu menciptakan empat objek.

pengguna220201
sumber
17
Saya hanya ingin mengatakan ini adalah pertanyaan yang sangat membantu; terima kasih sudah menanyakannya.
pandorym

Jawaban:

262

Ini benar.

A[] a = new A[4];

... membuat 4 Areferensi, mirip dengan melakukan ini:

A a1;
A a2;
A a3;
A a4;

Sekarang Anda tidak dapat melakukan a1.someMethod()tanpa mengalokasikan a1seperti ini:

a1 = new A();

Demikian pula, dengan array yang perlu Anda lakukan ini:

a[0] = new A();

... sebelum menggunakannya.

MeBigFatGuy
sumber
10
Jawaban ini menyelamatkan saya dari banyak kebingungan, terima kasih atas keberadaannya.
pandorym
1
Saya memiliki kebingungan ini juga, karena saya dari latar belakang C ++ saya selalu berasumsi bahwa seperti di C ++ newkata kunci Java juga memanggil konstruktor dan mengalokasikan memori I. Saya kira di Jawa newhanya membuat referensi bukan objek yang sebenarnya dibandingkan dengan C ++. Terima kasih atas jawabannya.
Krishna Oza
1
@ Krishna_Oza, tidak ada perbedaan dari C ++ di sini. Yang pertama newmenciptakan objek array. Ini adalah objek yang dialokasikan secara dinamis ("heap"). Jadi kode C ++ analog akan A **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }.
Vsevolod Golovanov
1
Saya mendapatkan bahwa baru membuat referensi, tetapi mengapa tidak juga menginisialisasi konstruktor untuk setiap elemen array seperti di C ++. Ini mungkin konyol, tapi saya ingin bertanya, ada masalah yang kita miliki, jika kita melakukan itu ?? @MeBigFatGuy
Jasser
2
@Jasser - konstruktor apa untuk elemen yang akan Anda panggil? Bagaimana jika konstruktor elemen hanya mengambil banyak argumen? Bagaimana Anda membuat objek-objek itu?
MeBigFatGuy
77

Ini benar. Anda juga dapat melakukan:

A[] a = new A[] { new A("args"), new A("other args"), .. };

Sintaks ini juga dapat digunakan untuk membuat dan menginisialisasi array di mana saja, seperti dalam argumen metode:

someMethod( new A[] { new A("args"), new A("other args"), . . } )
Steve B.
sumber
34

Ya, itu hanya membuat referensi, yang ditetapkan ke nilai standarnya nol. Itu sebabnya Anda mendapatkan NullPointerException Anda perlu membuat objek secara terpisah dan menetapkan referensi. Ada 3 langkah untuk membuat array di Jawa -

Deklarasi - Pada langkah ini, kita menentukan tipe data dan dimensi array yang akan kita buat. Tapi ingat, kami belum menyebutkan ukuran dimensi. Mereka dibiarkan kosong.

Instansiasi - Pada langkah ini, kami membuat array, atau mengalokasikan memori untuk array, menggunakan kata kunci baru. Pada langkah ini kita menyebutkan ukuran dimensi array.

Inisialisasi - Array selalu diinisialisasi ke nilai default tipe data. Tetapi kita dapat membuat inisialisasi kita sendiri.

Mendeklarasikan Array Di Jawa

Ini adalah bagaimana kami mendeklarasikan array satu dimensi di Jawa -

int[] array;
int array[];

Oracle menyarankan Anda menggunakan sintaksis sebelumnya untuk mendeklarasikan array. Berikut adalah beberapa contoh deklarasi hukum lainnya -

// One Dimensional Arrays
int[] intArray;             // Good
double[] doubleArray;

// One Dimensional Arrays
byte byteArray[];           // Ugly!
long longArray[];

// Two Dimensional Arrays
int[][] int2DArray;         // Good
double[][] double2DArray;

// Two Dimensional Arrays
byte[] byte2DArray[];       // Ugly
long[] long2DArray[];

Dan ini adalah beberapa contoh deklarasi ilegal -

int[5] intArray;       // Don't mention size!
double{} doubleArray;  // Square Brackets please!

Instansiasi

Ini adalah bagaimana kami "instantiate", atau mengalokasikan memori untuk sebuah array -

int[] array = new int[5];

Ketika JVM menemukan newkata kunci, ia mengerti bahwa ia harus mengalokasikan memori untuk sesuatu. Dan dengan menentukan int[5], maksud kami adalah array ints, berukuran 5. Jadi, JVM menciptakan memori dan menetapkan referensi memori yang baru dialokasikan ke array yang merupakan "referensi" jenisint[]

Inisialisasi

Menggunakan Loop - Menggunakan loop untuk menginisialisasi elemen array adalah cara yang paling umum untuk mendapatkan array. Tidak perlu menjalankan loop untuk jika Anda akan menetapkan nilai default itu sendiri, karena JVM melakukannya untuk Anda.

Semua dalam satu..! - Kita dapat mendeklarasikan, Instantiate, dan Inisialisasi array kita sekaligus. Inilah sintaksinya -

int[] arr = {1, 2, 3, 4, 5};

Di sini, kami tidak menyebutkan ukuran, karena JVM dapat melihat bahwa kami memberikan 5 nilai.

Jadi, sampai kita instantiate referensi tetap nol. Saya harap jawaban saya telah membantu Anda ..! :)

Sumber - Array di Jawa

Vamsi Sangam
sumber
5

Berikut adalah contoh yang jelas untuk membuat array 10 objek karyawan, dengan konstruktor yang mengambil parameter:

public class MainClass
{  
    public static void main(String args[])
    {
        System.out.println("Hello, World!");
        //step1 : first create array of 10 elements that holds object addresses.
        Emp[] employees = new Emp[10];
        //step2 : now create objects in a loop.
        for(int i=0; i<employees.length; i++){
            employees[i] = new Emp(i+1);//this will call constructor.
        }
    }
}

class Emp{
    int eno;
    public Emp(int no){
        eno = no;
        System.out.println("emp constructor called..eno is.."+eno);
    }
}
pengguna1923551
sumber
3

Anda benar. Selain itu jika kita ingin membuat array dengan ukuran tertentu yang diisi dengan elemen-elemen yang disediakan oleh beberapa "pabrik", karena Java 8 (yang memperkenalkan stream API ) kita dapat menggunakan satu-baris ini:

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
  • Stream.generate(() -> new A())seperti pabrik untuk elemen A terpisah yang dibuat dengan cara yang dijelaskan oleh lambda, () -> new A()yang merupakan implementasi dari Supplier<A>- itu menggambarkan bagaimana setiap instance A baru harus dibuat.
  • limit(4)menetapkan jumlah elemen yang akan dihasilkan aliran
  • toArray(A[]::new)(dapat juga ditulis ulang sebagai toArray(size -> new A[size])) - memungkinkan kita memutuskan / menjelaskan jenis array yang harus dikembalikan.

Untuk beberapa tipe primitif Anda dapat menggunakan DoubleStream, IntStream, LongStreamyang juga menyediakan generator seperti range rangeCloseddan beberapa orang lainnya.

Pshemo
sumber
0

Ya benar di Jawa ada beberapa langkah untuk membuat array objek:

  1. Mendeklarasikan dan kemudian Instantiating (Buat memori untuk menyimpan objek '4'):

    A[ ] arr = new A[4];
  2. Menginisialisasi Objek (Dalam hal ini Anda dapat Menginisialisasi 4 objek kelas A)

    arr[0] = new A();
    arr[1] = new A();
    arr[2] = new A();
    arr[3] = new A();

    atau

    for( int i=0; i<4; i++ )
      arr[i] = new A();

Sekarang Anda dapat mulai memanggil metode yang ada dari objek yang baru saja Anda buat dll.

Sebagai contoh:

  int x = arr[1].getNumber();

atau

  arr[1].setNumber(x);
Jeremy Levett
sumber
0

Untuk kelas generik perlu membuat kelas pembungkus. Sebagai contoh:

Set<String>[] sets = new HashSet<>[10]

menghasilkan: "Tidak dapat membuat array generik"

Gunakan sebaliknya:

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];  
SzB
sumber
Apakah garis ini berarti, Anda mencoba membuat array Sets, di mana tipe Set adalah String?
sofs1
0

Bentuk umum untuk mendeklarasikan array baru di java adalah sebagai berikut:

type arrayName[] = new type[numberOfElements];

Di mana tipe adalah tipe atau Objek primitif. numberOfElementsadalah jumlah elemen yang akan Anda simpan ke dalam array dan nilai ini tidak dapat berubah karena Java tidak mendukung array dinamis (jika Anda membutuhkan struktur yang fleksibel dan dinamis untuk memegang objek Anda mungkin ingin menggunakan beberapa koleksi Java).

Mari kita inisialisasi array untuk menyimpan gaji semua karyawan di sebuah perusahaan kecil yang terdiri dari 5 orang:

int salaries[] = new int[5];

Jenis array (dalam hal ini int) berlaku untuk semua nilai dalam array. Anda tidak dapat mencampur tipe dalam satu array.

Sekarang kita memiliki larik gaji yang diinisialisasi, kami ingin memasukkan beberapa nilai ke dalamnya. Kita dapat melakukan ini selama inisialisasi seperti ini:

int salaries[] = {50000, 75340, 110500, 98270, 39400};

Atau untuk melakukannya di titik selanjutnya seperti ini:

salaries[0] = 50000;
salaries[1] = 75340;
salaries[2] = 110500;
salaries[3] = 98270;
salaries[4] = 39400;

Lebih banyak contoh visual pembuatan array: masukkan deskripsi gambar di sini

Untuk mempelajari lebih lanjut tentang Array, lihat panduan ini .

Johnny
sumber