你好,我想问下java中对象的初始化过程具体指什么,是怎样进行初始化的
PHPz
PHPz 2017-04-18 10:35:57
0
5
411
PHPz
PHPz

学习是最好的投资!

membalas semua(5)
小葫芦
public class A {
    A a = new A();
    public static void main(String[] args) {
        A a = new A();
    }
}

Kod di atas disusun menjadi kod bait dan diterjemahkan kembali seperti ini:

public class A {
    public A(){
        A a = new A();//这里重复调用了自己
    }
    public static void main(String[] args) {
        A a = new A();
    }
}
大家讲道理

Jawapan paling mudah ialah mencipta objek setiap kali new A().

Mari kita menganalisis proses yang lebih terperinci
1 Selepas program dijalankan, ia mula-mula memasuki fungsi main, dan kemudian melaksanakannya buat kali pertamanew A();
2 tiada pembina dipaparkan, pengkompil Apabila menyusun, pembina tanpa parameter akan dihasilkan

 public A(){
 }

3. Selepas memasukkan pembina di atas, anda mesti memulakan pembolehubah ahli, iaitu, A a = new A();
4. Ini adalah kunci kepada masalah, sama ada untuk memulakan pembolehubah ahli A atau new A() dan terus memanggil 2 Pembina.
5. Kemudian langkah 2, 3, dan 4 akan diulang sehingga ruang tindanan benang ini tidak mencukupi dan ralat StackOverflowError dilemparkan.

Di sini kita juga perlu mempopularkan beberapa pengetahuan tentang panggilan kaedah Dalam JVM, setiap utas akan diperuntukkan ruang tindanan tertentu (tidak dikongsi ruang tindanan ini boleh diperbaiki atau dikembangkan secara dinamik JVM pelaksanaan di sini boleh berbeza. Setiap kali kaedah dilaksanakan dalam benang, kaedah itu akan ditolak ke dalam tindanan benang dalam bentuk bingkai tindanan.

Sebab mengapa StackOverflowError muncul di atas adalah kerana kaedah pembina dipanggil secara berterusan, dan kemudian bingkai tindanan dibuat secara berterusan dan ditolak ke dalam tindanan benang Akhirnya, ruang tindanan tidak mencukupi, menyebabkan limpahan tindanan.

PHPzhong

Permulaan pembolehubah dan mekanisme operasi dalam ingatan

Permulaan pembolehubah ahli dan mekanisme operasi dalam ingatan

Apabila sistem memuatkan kelas atau mencipta contoh kelas, sistem secara automatik memperuntukkan ruang memori untuk pembolehubah ahli, dan selepas memperuntukkan ruang memori, secara automatik memberikan nilai awal kepada pembolehubah ahli.

Permulaan pembolehubah tempatan dan mekanisme operasi dalam ingatan

Selepas pembolehubah tempatan ditakrifkan, pembolehubah tersebut mesti dimulakan secara eksplisit sebelum ia boleh digunakan Sistem tidak akan memulakan pembolehubah setempat. Ini bermakna selepas pembolehubah tempatan ditakrifkan, sistem tidak memperuntukkan ruang memori untuk pembolehubah Ia tidak akan memperuntukkan memori untuk pembolehubah tempatan sehingga program memberikan nilai awal kepada pembolehubah dan menyimpan nilai awal ke memori ini.

Kod yang betul

public class A 
{
    public static void main(String[] args) 
    {
        A a = new A();
    }
}

java.lang.StackOverflowError

java.lang.StackOverflowError bermaksud limpahan memori dan gelung tak terhingga tidak seharusnya mencipta instance kelas A dalam kelas A. A() adalah bersamaan dengan pembina tanpa parameter Tulis A a = terus dalam kelas A. baru A(); akan menyebabkan penciptaan berulang infiniti, akhirnya membawa kepada limpahan memori;

Suplemen ilmu

Alu-alukan penyoal untuk datang ke laman utama saya untuk mempelajari pengetahuan Java dan bertukar-tukar panduan Mata pengetahuan yang disebut oleh penyoal disebut dalam Orientasi Objek Java (Bahagian 1) di laman utama saya: https://segmentfault.com/a. /11 ...

洪涛

Dua orang di atas telah menerangkannya dengan sangat jelas, anda menambah pembolehubah contoh a anda sendiri ke kelas A. Ini bukan masalah sendiri, tetapi anda meletakkan permulaan a dalam proses. permulaan instance , dalam kes ini, selagi A() baharu dipanggil sekali, ia akan memasuki gelung panggilan tak terhingga, jadi timbunan akan melimpah.

黄舟

Ia adalah panggilan rekursif yang sangat jelas, dan tiada keadaan tamat, yang pasti akan menyebabkan limpahan memori. Rekursi memanggil kaedah itu sendiri dalam kaedah, dan kes yang anda berikan adalah istimewa, ia adalah kaedah pembina, sebabnya adalah semudah itu.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan