"Hej, Amigo! For et par dage siden fortalte jeg dig om overbelastningsmetoder. Forstod du alt?"

"Ja. Jeg kan huske. Hver klassemetode skal være unik. En medlemsmetode er unik, hvis klassen ikke har nogen anden metode med samme navn og parametertyper (og rækkefølgen af ​​parametrene har betydning)."

"Meget godt! Jeg kan se, du har lært den lektie godt. I dag vil jeg gerne udvide din viden om dette emne en smule. Hvilken metode tror du vil blive kaldt i hvert enkelt tilfælde?"

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

"Det er svært at sige."

"I det første tilfælde er 1 en int . Vi har et 100% match med metoden, der tager en int. Det første void print(int n). vil blive kaldt.

I det andet tilfælde har vi ikke en metode, der tager en byte. Men der er to metoder, der tager en kort og en int. Baseret på regler for typeudvidelse, vil en byte først blive udvidet til en short og derefter udvidet til en int. Således er dommen, at tomrummet print(kort n). vil blive kaldt.

I det tredje tilfælde har vi et 100% match med metoden, der tager en streng. Det ugyldige print(String s). metode vil blive kaldt.

Det fjerde tilfælde er tvetydigt. null har ikke en bestemt type. Kompileren vil nægte at kompilere denne kode . I dette tilfælde skal vi skrive Cat.print((Integer)null) for at kalde den tredje metode og Cat.print((String)null) for at kalde den fjerde."

"Det var meget informativt. Tak."

"Jeg vil gerne påpege, at når man bestemmer den korrekte metode til at kalde, kan typer kun udvides. De kan ikke indsnævres. Overvej dette eksempel:"

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

I det første tilfælde vil bytetypen blive udvidet til en kort, og den første metode kaldes: void print(short n). .

I det andet tilfælde vil der være en implicit udvidende konvertering fra int til heltal, og så vil den anden metode blive kaldt: void print(Integer n). .

"Det havde jeg ikke forventet."

"Nej, her er den virkelige overraskelse:"

Java kode Beskrivelse
 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);
 }
}
I det første tilfælde vil int blive udvidet til Integer. Fordi der ikke er nogen metode til heltal, er den bedst egnede metode (og den der kaldes) void print(Object o)

I det andet tilfælde vil der ikke være nogen kompileringsfejl, og void print(String s) vil blive kaldt, hvilket er noget ikke indlysende.

"Amigo, jeg håber du forstår, at det i sådanne tilfælde er bedst at specificere en type cast-operator (som i vi gjorde med «(byte)") for at vide præcis, hvilken metode der vil blive kaldt."

"Jeg havde aldrig forventet, at der ville komme nogen problemer fra overbelastningsmetoder. Men så kommer du med. Tak, Rishi. Jeg vil holde mig på vagt på dette punkt."