Rumah  >  Artikel  >  Java  >  Panggilan pembina rekursif dalam Java

Panggilan pembina rekursif dalam Java

WBOY
WBOYke hadapan
2023-08-27 15:41:071364semak imbas

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.

Panggilan pembina rekursif

Pembina

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).

Contoh 1

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
   }
}

Output

I am constructor

Walaupun terdapat persamaan antara pembina dan kaedah, Java tidak membenarkan pembina rekursif. Ini adalah amalan pengaturcaraan yang buruk.

Contoh 2

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");
   }
}

Output

Cart.java:4: error: recursive constructor invocation
Cart(String item, int price) { // constructor
   ^
1 error
Terjemahan bahasa Cina bagi

Contoh 3

ialah:

Contoh 3

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");
   }
}

Output

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 bagi

Contoh 4

ialah:

Contoh 4

Contoh 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");
   }
}

Output

Constructor calling another Constructor

Kesimpulan

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!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam