"Hej, Amigo! För ett par dagar sedan berÀttade jag om överbelastningsmetoder. Förstod du allt?"

"Ja. Jag kommer ihÄg. Varje klassmetod mÄste vara unik. En medlemsmetod Àr unik om klassen inte har nÄgon annan metod med samma namn och parametertyper (och ordningen pÄ parametrarna spelar roll)."

"Mycket bra! Jag ser att du har lÀrt dig den lÀxan bra. Idag vill jag utöka dina kunskaper i det hÀr Àmnet lite. Vilken metod tror du kommer att kallas i varje enskilt fall?"

Koda
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 Àr svÄrt att sÀga."

"I det första fallet Àr 1 en int . Vi har en 100% matchning med metoden som tar en int. Den första void print(int n). kommer att anropas.

I det andra fallet har vi ingen metod som tar en byte. Men det finns tvÄ metoder som tar en kort och en int. Baserat pÄ regler för typbreddning kommer en byte först att breddas till en kort och sedan breddas till en int. SÄledes Àr domen att tomrummet tryck (kort n). kommer att kallas.

I det tredje fallet har vi en 100% matchning med metoden som tar en strÀng. Den tomma utskriften (String s). metoden kommer att kallas.

Det fjÀrde fallet Àr tvetydigt. null har inte en specifik typ. Kompilatorn kommer att vÀgra att kompilera den hÀr koden . I det hÀr fallet mÄste vi skriva Cat.print((Integer)null) för att anropa den tredje metoden och Cat.print((String)null) för att anropa den fjÀrde."

"Det var vÀldigt informativt. Tack."

"Jag skulle vilja pÄpeka att nÀr man bestÀmmer den korrekta metoden att anropa kan typerna bara bredda sig. De kan inte begrÀnsas. TÀnk pÄ det hÀr exemplet:"

Koda
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örsta fallet kommer bytetypen att breddas till en kort och den första metoden kommer att kallas: void print(short n). .

I det andra fallet kommer det att ske en implicit utvidgningskonvertering frÄn int till heltal, och dÄ kommer den andra metoden att kallas: void print(Integer n). .

— Det hade jag inte förvĂ€ntat mig.

"Nej, hÀr Àr den verkliga överraskningen:"

Java-kod Beskrivning
 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örsta fallet kommer int att utökas till heltal. Eftersom det inte finns nÄgon metod för heltal, Àr den mest lÀmpliga metoden (och den som kallas) void print(Object o)

I det andra fallet kommer det inte att finnas nÄgra kompileringsfel och void print(String s) kommer att anropas, vilket Àr nÄgot inte uppenbart.

"Amigo, jag hoppas att du förstÄr att i sÄdana fall Àr det bÀst att ange en typ av rolloperator (som vi gjorde med «(byte)») för att veta exakt vilken metod som kommer att kallas."

"Jag hade aldrig förvÀntat mig att nÄgra problem skulle komma frÄn överbelastningsmetoder. Men sedan kommer du med. Tack, Rishi. Jag ska hÄlla mig pÄ den hÀr punkten."