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.
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.
Kod di atas disusun menjadi kod bait dan diterjemahkan kembali seperti ini:
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
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
ataunew 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 dinamikJVM
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.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
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 ilmuDua 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.