"Hello, Amigo! Beberapa hari yang lalu saya memberitahu anda tentang kaedah terlebih beban. Adakah anda memahami segala-galanya?"

"Ya. Saya ingat. Setiap kaedah kelas mesti unik. Kaedah ahli adalah unik jika kelas tidak mempunyai kaedah lain dengan nama dan jenis parameter yang sama (dan susunan parameter penting)."

"Sangat bagus! Saya lihat anda telah mempelajari pelajaran itu dengan baik. Hari ini saya ingin mengembangkan sedikit pengetahuan anda dalam topik ini. Apakah kaedah yang anda fikir akan dipanggil dalam setiap kes?"

Kod
class Cat
{
 public static void print(int n)
 {
  System.out.println(n);
 }
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }
public static void main(String[] args)
{
  Cat.print(1);
  Cat.print((byte)1);
  Cat.print("1");
  Cat.print(null);
 }
}

"Susah nak cakap."

"Dalam kes pertama, 1 ialah int . Kami mempunyai padanan 100% dengan kaedah yang mengambil int. Cetakan lompang pertama(int n). akan dipanggil.

Dalam kes kedua, kami tidak mempunyai kaedah yang mengambil bait. Tetapi terdapat dua kaedah yang mengambil masa yang singkat dan int. Berdasarkan peraturan pelebaran jenis, bait pertama akan diluaskan kepada pendek, dan kemudian diluaskan kepada int. Oleh itu, keputusannya ialah cetakan batal(n pendek). akan dipanggil.

Dalam kes ketiga, kami mempunyai padanan 100% dengan kaedah yang mengambil String. Cetakan kosong (String s). kaedah akan dipanggil.

Kes keempat adalah samar-samar. null tidak mempunyai jenis tertentu. Pengkompil akan menolak untuk menyusun kod ini . Dalam kes ini, kita perlu menulis Cat.print((Integer)null) untuk memanggil kaedah ketiga dan Cat.print((String)null) untuk memanggil yang keempat."

"Itu sangat bermaklumat. Terima kasih."

"Saya ingin menyatakan bahawa apabila menentukan kaedah yang betul untuk memanggil, jenis hanya boleh melebar. Mereka tidak boleh mengecil. Pertimbangkan contoh ini:"

Kod
class Cat
{
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }

 public static void main(String[] args)
 {
  Cat.print((byte)1);
  Cat.print(1);
 }
}

Dalam kes pertama, jenis bait akan diluaskan kepada pendek dan kaedah pertama akan dipanggil: void print(short n). .

Dalam kes kedua, akan terdapat penukaran pelebaran tersirat daripada int kepada Integer, dan kemudian kaedah kedua akan dipanggil: void print(Integer n). .

"Saya tidak menjangkakan itu."

"Tidak, inilah kejutan sebenar:"

kod Java Penerangan
class Cat
{
 public static void print(Object o)
 {
  System.out.println(o);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }

 public static void main(String[] args)
 {
  Cat.print(1);
  Cat.print(null);
 }
}
Dalam kes pertama, int akan dilanjutkan kepada Integer. Kerana tiada kaedah untuk Integer, kaedah yang paling sesuai (dan yang dipanggil) ialah cetakan kosong(Objek o)

Dalam kes kedua, tidak akan ada sebarang ralat penyusunan dan cetakan batal(String s) akan dipanggil, yang agak tidak jelas.

"Amigo, saya harap anda faham bahawa dalam kes sedemikian adalah lebih baik untuk menentukan jenis operator cast (seperti yang kami lakukan dengan «(bait)») untuk mengetahui dengan tepat kaedah yang akan dipanggil."

"Saya tidak pernah menjangkakan apa-apa masalah akan datang daripada kaedah terlebih beban. Tetapi kemudian awak ikut serta. Terima kasih, Rishi. Saya akan sentiasa berjaga-jaga mengenai perkara ini."