"Hei, Amigo! For et par dager siden fortalte jeg deg om overbelastningsmetoder. Forsto du alt?"

"Ja. Jeg husker. Hver klassemetode må være unik. En medlemsmetode er unik hvis klassen ikke har noen annen metode med samme navn og parametertyper (og rekkefølgen på parameterne har betydning)."

"Veldig bra! Jeg ser at du har lært den leksjonen godt. I dag vil jeg utvide kunnskapen din om dette emnet litt. Hvilken metode tror du vil bli kalt i hvert tilfelle?"

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 vanskelig å si."

"I det første tilfellet er 1 en int . Vi har et 100 % samsvar med metoden som tar en int. Den første void print(int n). vil bli kalt.

I det andre tilfellet har vi ikke en metode som tar en byte. Men det er to metoder som tar en kort og en int. Basert på regler for typeutvidelse vil en byte først utvides til en short, og deretter utvides til en int. Dermed er dommen at tomrommet print(kort n). vil bli kalt.

I det tredje tilfellet har vi 100 % samsvar med metoden som tar en streng. Den ugyldige utskriften (streng s). metoden vil bli kalt.

Det fjerde tilfellet er tvetydig. null har ikke en bestemt type. Kompileren vil nekte å kompilere denne koden . I dette tilfellet må vi skrive Cat.print((Integer)null) for å kalle den tredje metoden og Cat.print((String)null) for å kalle den fjerde."

"Det var veldig informativt. Takk."

"Jeg vil gjerne påpeke at når du bestemmer den riktige metoden for å ringe, kan typer bare utvides. De kan ikke begrenses. Tenk på dette eksemplet:"

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 tilfellet vil bytetypen utvides til en kort og den første metoden kalles: void print(short n). .

I det andre tilfellet vil det være en implisitt utvidelseskonvertering fra int til heltall, og deretter vil den andre metoden bli kalt: void print(Integer n). .

— Det hadde jeg ikke forventet.

"Nei, her er den virkelige overraskelsen:"

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 tilfellet vil int bli utvidet til heltall. Fordi det ikke finnes noen metode for heltall, er den mest passende metoden (og den som kalles) void print(Object o)

I det andre tilfellet vil det ikke være noen kompileringsfeil og void print(String s) vil bli kalt opp, noe som ikke er åpenbart.

"Amigo, jeg håper du forstår at i slike tilfeller er det best å spesifisere en type cast-operatør (som vi gjorde med «(byte)») for å vite nøyaktig hvilken metode som vil bli kalt."

"Jeg hadde aldri forventet at noen problemer ville komme fra overbelastningsmetoder. Men så kommer du med. Takk, Rishi. Jeg skal holde meg på vakt på dette punktet."