"Merhaba Amigo! Birkaç gün önce sana aşırı yükleme yöntemlerinden bahsetmiştim. Her şeyi anladın mı?"

"Evet. Hatırlıyorum. Her sınıf yöntemi benzersiz olmalıdır. Sınıfın aynı ada ve parametre türlerine sahip başka bir yöntemi yoksa bir üye yöntemi benzersizdir (ve parametrelerin sırası önemlidir)."

"Çok güzel! Bu dersi iyi öğrendiğini görüyorum. Bugün bu konudaki bilgini biraz genişletmek istiyorum. Her durumda hangi yöntemin çağrılacağını düşünüyorsun?"

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

"Söylemesi zor."

"İlk durumda, 1 bir int'dir . İnt alan yöntemle %100 eşleşmemiz var. İlk geçersiz print(int n). çağrılacak.

İkinci durumda, bayt alan bir yöntemimiz yok. Ancak bir kısa ve bir int alan iki yöntem vardır. Tip genişletme kurallarına göre, bir bayt önce kısa olarak genişletilir ve ardından bir int olarak genişletilir. Böylece hüküm, geçersiz baskının (kısa n) olduğu yönündedir. Aranacak.

Üçüncü durumda, String alan yöntemle %100 eşleşmemiz var. Geçersiz baskı(String s). yöntem çağrılacaktır.

Dördüncü durum belirsizdir. null belirli bir türe sahip değildir. Derleyici bu kodu derlemeyi reddedecektir . Bu durumda, üçüncü yöntemi çağırmak için Cat.print((Integer)null) ve dördüncüyü çağırmak için Cat.print((String)null) yazmamız gerekir ."

"Bu çok bilgilendiriciydi. Teşekkürler."

"Doğru arama yöntemini belirlerken, türlerin yalnızca genişleyebileceğini belirtmek isterim. Daralamazlar. Şu örneği düşünün:"

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

İlk durumda, bayt türü kısa olarak genişletilecek ve ilk yöntem şu şekilde çağrılacaktır: void print(short n). .

İkinci durumda, int'den Tamsayı'ya örtülü bir genişletme dönüştürmesi olacak ve sonra ikinci yöntem çağrılacak: void print(Tamsayı n). .

"Bunu beklemiyordum."

"Hayır, işte gerçek sürpriz:"

java kodu Tanım
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);
 }
}
İlk durumda, int, Tamsayıya genişletilecektir. Tamsayı için bir yöntem olmadığından, en uygun yöntem (ve çağrılan) geçersiz yazdırmadır (Object o)

İkinci durumda, herhangi bir derleme hatası olmayacak ve pek açık olmayan bir şekilde void print(String s) çağrılacaktır.

"Amigo, umarım bu tür durumlarda tam olarak hangi yöntemin çağrılacağını bilmek için bir tür atama işleci ("(byte)" ile yaptığımız gibi) belirlemenin en iyisi olduğunu anlıyorsundur."

"Aşırı yükleme yöntemlerinden herhangi bir sorun çıkacağını hiç beklemiyordum. Ama sonra sen gel. Teşekkürler Rishi. Bu noktada tetikte olacağım."