Rumah >Java >javaTutorial >Panggilan pembina rekursif dalam Java
Panggilan pembina rekursif ialah ralat masa kompilasi yang berlaku apabila pembina memanggil dirinya sendiri. Ia serupa dengan rekursi, di mana kaedah memanggil dirinya seberapa banyak yang diperlukan. Kaedah yang memanggil dirinya sendiri dipanggil kaedah rekursif, dan pembina yang memanggil dirinya sendiri dipanggil pembina rekursif.
Dalam artikel ini, kita akan belajar tentang ralat panggilan pembina rekursif dalam Java dengan beberapa contoh.
Ia sangat serupa dengan kaedah, tetapi perbezaannya ialah kaedah mentakrifkan kelakuan objek, manakala pembina digunakan untuk memulakan objek ini. Kita boleh memberikan kaedah apa-apa nama yang kita pilih, tetapi pembina mestilah sama dengan nama kelas. Tambahan pula, kaedah boleh mengembalikan nilai, tetapi pembina tidak mengembalikan sebarang nilai kerana mereka tidak boleh mempunyai sebarang jenis pulangan.
Apabila pengguna tidak membuat sebarang pembina, pengkompil Java secara automatik mencipta pembina (kami memanggilnya sebagai pembina lalai).
public class Cnst { // class name Cnst() { // constructor System.out.println("I am constructor"); } public static void main(String[] args) { Cnst obj = new Cnst(); // calling the Constructor } }
I am constructor
Walaupun terdapat persamaan antara pembina dan kaedah, Java tidak membenarkan pembina rekursif. Ini adalah amalan pengaturcaraan yang buruk.
Contoh berikut menggambarkan ralat panggilan pembina rekursif.
Di sini kita akan mencipta kelas dan menentukan pembina dan dua parameternya. Kami kemudian akan memanggil pembina yang sama di dalam badannya.
public class Cart { String item; double price; Cart(String item, int price) { // constructor this(item, price); // constructor is calling itself // this keyword shows these variables belong to constructor this.item = item; this.price = price; } public static void main(String[] args) { Cart obj = new Cart("Bread", 15); // creating object System.out.println("Constructor calling another Constructor"); } }
Cart.java:4: error: recursive constructor invocation Cart(String item, int price) { // constructor ^ 1 errorTerjemahan bahasa Cina bagi
Dalam contoh berikut, kami akan cuba mentakrifkan objek di dalam pembina untuk menyemak sama ada Java membenarkan penciptaan objek di dalam pembina.
public class Cart { String item; double price; Cart(String item, int price) { // constructor // this keyword shows these variables belong to constructor this.item = item; this.price = price; Cart obj2 = new Cart("Milk", 55); // creating object } public static void main(String[] args) { Cart obj1 = new Cart("Bread", 15); // creating another object System.out.println("Constructor calling another Constructor"); } }
Exception in thread "main" java.lang.StackOverflowError at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9) at Cart.<init>(Cart.java:9)
Kami mendapat StackOverflowError kerana mencipta objek di dalam pembina menghasilkan gelung tak terhingga penciptaan objek.
Terjemahan bahasa Cina bagiContoh berikut menunjukkan bahawa adalah sah untuk memanggil pembina dalam pembina lain.
public class Cart { // class String item; double price; Cart(String item, int price) { // first constructor // this keyword shows these variables belong to constructor this.item = item; this.price = price; } public Cart (int price) { // second constructor this(null, price); // calling the 1st constructor } public static void main(String[] args) { Cart obj = new Cart(15); // creating object System.out.println("Constructor calling another Constructor"); } }
Constructor calling another Constructor
Java tidak membenarkan pengulangan pembina, jadi amalan pengaturcaraan ini jelas harus dielakkan. Dalam artikel ini, kami cuba menerangkan pembina rekursif, bermula dengan perbincangan tentang pembina. Selain itu, kami menemui ralat lain yang dipanggil StackOverflowError yang disebabkan oleh gelung tak terhingga.
Atas ialah kandungan terperinci Panggilan pembina rekursif dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!