"Hallo, Amigo! Een paar dagen geleden vertelde ik je over overbelastingsmethodes. Heb je alles begrepen?"

"Ja. Ik herinner het me. Elke klassemethode moet uniek zijn. Een lidmethode is uniek als de klasse geen andere methode heeft met dezelfde naam en parametertypen (en de volgorde van de parameters is van belang)."

"Heel goed! Ik zie dat je die les goed hebt geleerd. Vandaag wil ik je kennis over dit onderwerp een beetje uitbreiden. Welke methode denk je dat in elk geval zal worden genoemd?"

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

"Het is moeilijk te zeggen."

"In het eerste geval is 1 een int . We hebben een 100% overeenkomst met de methode die een int nodig heeft. De eerste ongeldige afdruk (int n) wordt aangeroepen.

In het tweede geval hebben we geen methode die een byte nodig heeft. Maar er zijn twee methoden die een korte en een int nemen. Op basis van regels voor typeverbreding wordt een byte eerst verbreed tot een korte en vervolgens verbreed tot een int. Het vonnis is dus dat de ongeldige afdruk (korte n). zal gebeld worden.

In het derde geval hebben we een 100% match met de methode die een string nodig heeft. De lege afdruk (String s). methode wordt genoemd.

Het vierde geval is dubbelzinnig. null heeft geen specifiek type. De compiler zal weigeren deze code te compileren . In dit geval moeten we Cat.print((Integer)null) schrijven om de derde methode aan te roepen en Cat.print((String)null) om de vierde aan te roepen."

"Dat was heel informatief. Dank je wel."

"Ik zou erop willen wijzen dat bij het bepalen van de juiste methode om te callen, typen alleen kunnen verbreden. Ze kunnen niet smaller worden. Beschouw dit voorbeeld:"

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

In het eerste geval wordt het bytetype verbreed tot een short en de eerste methode heet: void print(short n). .

In het tweede geval zal er een impliciete verwijdingsconversie zijn van int naar Integer, en dan zal de tweede methode worden aangeroepen: void print(Integer n). .

"Dat had ik niet verwacht."

"Nee, hier is de echte verrassing:"

Java-code Beschrijving
 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);
 }
}
In het eerste geval wordt int uitgebreid tot Integer. Omdat er geen methode is voor Integer, is de meest geschikte methode (en degene die wordt genoemd) void print(Object o)

In het tweede geval zullen er geen compilatiefouten zijn en wordt void print(String s) aangeroepen, wat enigszins niet voor de hand ligt.

"Amigo, ik hoop dat je begrijpt dat het in dergelijke gevallen het beste is om een ​​type cast-operator op te geven (zoals we deden met «(byte)") om precies te weten welke methode zal worden aangeroepen."

'Ik had nooit verwacht dat er problemen zouden komen door overbelastingsmethodes. Maar dan kom je langs. Bedankt, Rishi. Ik zal op dit punt op mijn hoede blijven.'