"안녕하세요, 아미고! 며칠 전에 메소드 오버로딩에 대해 말씀드렸습니다. 다 이해하셨나요?"

"예. 기억합니다. 각 클래스 메서드는 고유해야 합니다. 클래스에 이름과 매개변수 유형이 동일한 다른 메서드가 없으면 멤버 메서드는 고유합니다(매개변수의 순서가 중요함)."

"아주 좋아! 그 교훈을 잘 배웠구나. 오늘 나는 이 주제에 대한 지식을 조금 더 넓히고 싶다. 각각의 경우에 어떤 방법이 불릴 것이라고 생각하니?"

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

"말하기 어렵다."

"첫 번째 경우 1은 int 입니다 . int를 취하는 메서드와 100% 일치합니다. 첫 번째 void print(int n). 가 호출됩니다.

두 번째 경우에는 바이트를 사용하는 메서드가 없습니다. 그러나 short와 int를 사용하는 두 가지 방법이 있습니다. 유형 확장 규칙에 따라 바이트는 먼저 short로 확장된 다음 int로 확장됩니다. 따라서 평결은 void print(짧은 n)입니다. 호출됩니다.

세 번째 경우에는 문자열을 취하는 메서드와 100% 일치합니다. 무효 인쇄(문자열 s). 메소드가 호출됩니다.

네 번째 경우는 모호합니다. null에는 특정 유형이 없습니다. 컴파일러는 이 코드의 컴파일을 거부합니다 . 이 경우 Cat.print((Integer)null)을 작성하여 세 번째 메소드를 호출하고 Cat.print((String)null)을 작성 하여 네 번째 메소드를 호출 해야 합니다 ."

"매우 유익했습니다. 감사합니다."

"올바른 호출 방법을 결정할 때 유형은 넓어질 수만 있고 좁힐 수 없다는 점을 지적하고 싶습니다. 다음 예를 고려하십시오."

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

첫 번째 경우에는 바이트 유형이 short로 확장되고 첫 번째 메서드가 호출됩니다: void print(short n). .

두 번째 경우에는 int에서 Integer로의 암묵적 확장 변환이 있을 것이며 두 번째 메서드인 void print(Integer n)가 호출됩니다 . .

"나는 그것을 기대하지 않았다."

"아니요, 정말 놀라운 사실은 다음과 같습니다."

자바 코드 설명
 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);
 }
}
첫 번째 경우 int는 Integer로 확장됩니다. Integer에 대한 메서드가 없기 때문에 가장 적합한 메서드(및 호출된 메서드)는 void print(Object o)

두 번째 경우에는 컴파일 오류가 없으며 void print(String s)가 호출되는데 이는 다소 명확하지 않습니다.

"아미고, 그런 경우에 어떤 메서드가 호출될지 정확히 알기 위해 타입 캐스트 연산자를 지정하는 것이 가장 좋다는 점을 이해해 주셨으면 합니다."

"메소드 과부하로 인해 문제가 발생할 것이라고는 전혀 예상하지 못했습니다. 그런데 당신이 따라옵니다. 감사합니다. Rishi. 이 점에 대해서는 경계를 늦추지 않겠습니다."