"Halo, Amigo! Beberapa hari yang lalu saya memberi tahu Anda tentang metode kelebihan muatan. Apakah Anda mengerti semuanya?"

"Ya. Saya ingat. Setiap metode kelas harus unik. Metode anggota unik jika kelas tidak memiliki metode lain dengan nama dan tipe parameter yang sama (dan urutan parameter penting)."

"Bagus sekali! Saya melihat Anda telah mempelajari pelajaran itu dengan baik. Hari ini saya ingin sedikit memperluas pengetahuan Anda dalam topik ini. Menurut Anda, metode apa yang akan dipanggil dalam setiap kasus?"

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

"Sulit untuk mengatakannya."

"Dalam kasus pertama, 1 adalah int . Kami memiliki kecocokan 100% dengan metode yang menggunakan int. Void print(int n) pertama akan dipanggil.

Dalam kasus kedua, kami tidak memiliki metode yang membutuhkan satu byte. Tapi ada dua metode yang mengambil short dan int. Berdasarkan aturan pelebaran tipe, sebuah byte pertama-tama akan diperlebar menjadi short, dan kemudian diperlebar menjadi int. Jadi, putusannya adalah void print(n pendek). akan dipanggil.

Dalam kasus ketiga, kami memiliki kecocokan 100% dengan metode yang menggunakan String. Cetak kosong (String s). metode akan dipanggil.

Kasus keempat adalah ambigu. null tidak memiliki tipe tertentu. Compiler akan menolak untuk mengkompilasi kode ini . Dalam hal ini, kita perlu menulis Cat.print((Integer)null) untuk memanggil metode ketiga dan Cat.print((String)null) untuk memanggil metode keempat."

"Itu sangat informatif. Terima kasih."

"Saya ingin menunjukkan bahwa saat menentukan metode panggilan yang benar, tipe hanya dapat melebar. Mereka tidak dapat menyempit. Pertimbangkan contoh ini:"

Kode
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 kasus pertama, tipe byte akan diperlebar menjadi short dan metode pertama akan dipanggil: void print(short n). .

Dalam kasus kedua, akan ada konversi pelebaran implisit dari int ke Integer, dan kemudian metode kedua akan dipanggil: void print(Integer n). .

"Aku tidak mengharapkan itu."

"Tidak, inilah kejutan sebenarnya:"

kode jawa Keterangan
 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 kasus pertama, int akan diperluas ke Integer. Karena tidak ada metode untuk Integer, metode yang paling cocok (dan yang dipanggil) adalah void print(Object o)

Dalam kasus kedua, tidak akan ada kesalahan kompilasi dan void print(String s) akan dipanggil, yang agak tidak jelas.

"Amigo, saya harap Anda mengerti bahwa dalam kasus seperti itu, lebih baik menentukan operator pemeran tipe (seperti yang kami lakukan dengan «(byte)») untuk mengetahui dengan tepat metode mana yang akan dipanggil."

"Aku tidak pernah menyangka akan ada masalah yang datang dari metode kelebihan beban. Tapi kemudian kamu ikut. Terima kasih, Rishi. Aku akan tetap waspada dalam hal ini."