"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > java의 과부하 메소드로`null '을 전달하면 왜'string '매개 변수로 메소드를 호출합니까?

java의 과부하 메소드로`null '을 전달하면 왜'string '매개 변수로 메소드를 호출합니까?

2025-03-04에 게시되었습니다
검색:248

Why does passing `null` to an overloaded method in Java call the method with the `String` parameter?

다음 코드 스 니펫을 고려하십시오 :

public class moneycalc { 공개 무효 방법 (Object O) { System.out.println ( "Object Verion"); } 공개 무효 방법 (문자열 s) { System.out.println ( "문자열 버전"); } public static void main (String args []) { MoneyCalc Question = New MoneyCalc (); Question.Method (null); } }

질문 :

왜 널 값을 과부하 된 메소드로 전달 하는가? 특정 유형의 값은 아니지만 객체 및 문자열을 포함하여 참조 유형의 변수에 할당 할 수 있습니다.

public class MoneyCalc {

   public void method(Object o) {
      System.out.println("Object Verion");
   }

   public void method(String s) {
      System.out.println("String Version");
   }

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

메소드 호출이 인수로 null로 만들어지면 컴파일러는 메소드 (객체) 버전보다 더 구체적이기 때문에 메소드 (string) 버전을 선택합니다. JLS (Java Language Specification)에 따르면, 가장 구체적인 오버로드는 적용 가능성과 특이성에 따라 선택됩니다. 이 경우 NULL은 객체 및 문자열 유형의 변수에 할당 할 수 있으므로 두 가지 메소드에 적용 할 수 있습니다. 특이성은 주어진 인수에 대한 방법이 얼마나 전문화되는지 측정합니다. 이 경우, Method (string) 과부하는 유형 문자열의 인수 만 처리하도록 설계 되었기 때문에 더 구체적입니다. 메소드 (객체) 오버로드는 유형 객체 또는 하위 클래스의 인수를 처리 할 수 ​​있기 때문에 더 일반적입니다.

따라서 컴파일러는 메소드 (문자열) 버전을 제공하는 인수에보다 구체적이고 적용 할 수 있으므로 널리 참조에 적용됩니다. MoneyCalc 클래스, 컴파일 오류가 발생합니다. 이 경우 메소드 (문자열) 나 메소드 (StringBuffer)도 다른 방법보다 구체적이지 않아 메소드 선택의 모호성을 초래하기 때문입니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3