"Hello, Amigo! A couple of days ago I told you about overloading methods. Naintindihan mo ba lahat?"

"Oo. Naaalala ko. Ang bawat pamamaraan ng klase ay dapat na natatangi. Ang pamamaraan ng miyembro ay natatangi kung ang klase ay walang ibang pamamaraan na may parehong pangalan at mga uri ng parameter (at mahalaga ang pagkakasunud-sunod ng mga parameter)."

"Very good! I see you've learned that lesson well. Today I want to expand your knowledge in this topic just a bit. Anong paraan sa tingin mo ang tatawagin sa bawat kaso?"

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

"Mahirap sabihin."

"Sa unang kaso, ang 1 ay isang int . Mayroon kaming 100% na tugma sa pamamaraang kumukuha ng int. Ang unang void print(int n). ay tatawagin.

Sa pangalawang kaso, wala kaming paraan na tumatagal ng isang byte. Ngunit mayroong dalawang pamamaraan na tumatagal ng isang maikli at isang int. Batay sa mga panuntunan sa pagpapalawak ng uri, ang isang byte ay lalawak muna sa isang maikli, at pagkatapos ay lalawak sa isang int. Kaya, ang hatol ay ang void print(short n). tatawagin.

Sa pangatlong kaso, mayroon kaming 100% na tugma sa paraan na kumukuha ng String. Ang void print(String s). paraan ay tatawagin.

Ang ikaapat na kaso ay hindi maliwanag. Ang null ay walang partikular na uri. Tatanggi ang compiler na i-compile ang code na ito . Sa kasong ito, kailangan nating isulat ang Cat.print((Integer)null) para tawagan ang ikatlong paraan at Cat.print((String)null) para tawagan ang pang-apat."

"That was very informative. Salamat."

"Gusto kong ipahiwatig na kapag tinutukoy ang tamang paraan ng pagtawag, ang mga uri ay maaari lamang lumawak. Hindi sila maaaring makitid. Isaalang-alang ang halimbawang ito:"

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

Sa unang kaso, ang uri ng byte ay lalawak sa isang maikli at ang unang paraan ay tatawaging: void print(short n). .

Sa pangalawang kaso, magkakaroon ng implicit widening conversion mula int hanggang Integer, at pagkatapos ay tatawagin ang pangalawang paraan: void print(Integer n). .

"Hindi ko inaasahan iyon."

"Hindi, narito ang tunay na sorpresa:"

Java code Paglalarawan
 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);
 }
}
Sa unang kaso, ang int ay mapapalawak sa Integer. Dahil walang paraan para sa Integer, ang pinaka-angkop na paraan (at ang tinatawag) ay void print(Object o)

Sa pangalawang kaso, hindi magkakaroon ng anumang mga error sa compilation at tatawagin ang void print(String s) , na medyo hindi halata.

"Amigo, sana maintindihan mo na sa mga ganitong pagkakataon, pinakamahusay na tumukoy ng uri ng cast operator (tulad ng ginawa namin sa «(byte)») upang malaman kung aling paraan ang tatawagin."

"I never expected any problems will come from overloading methods. But then you come along. Thanks, Rishi. I'll keep up my guard on this point."