>  기사  >  Java  >  Java에서 오버로드된 메소드에 `null`을 전달하면 `String` 매개변수가 있는 메소드가 호출되는 이유는 무엇입니까?

Java에서 오버로드된 메소드에 `null`을 전달하면 `String` 매개변수가 있는 메소드가 호출되는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-07 02:35:02909검색

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

메소드 오버로딩 및 Null 매개변수 선택

Java에서는 메소드가 오버로드되면 이름은 같지만 매개변수 목록이 다른 여러 메소드가 존재합니다. . 메서드 호출이 수행되면 컴파일러는 전달된 실제 인수의 수와 유형을 기반으로 호출할 오버로드된 메서드를 결정합니다.

다음 코드 조각을 고려하세요.

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 값을 전달하면 메서드(문자열) 버전이 호출되는 이유는 무엇인가요?

답변:

Java에서 null은 존재하지 않는 개체에 대한 참조를 나타내는 특수 상수 값입니다. 특정 유형의 값은 아니지만 Object 및 String을 포함한 모든 참조 유형의 변수에 할당할 수 있습니다.

인수로 null을 사용하여 메소드를 호출하면 컴파일러는 다음을 선택합니다. method(String) 버전은 method(Object) 버전보다 더 구체적이기 때문입니다. JLS(Java 언어 사양)에 따르면 적용 가능성과 특수성을 기준으로 가장 구체적인 오버로드가 선택됩니다.

적용 가능성은 컴파일 시간 오류 없이 인수를 메서드에 전달할 수 있는지 여부를 나타냅니다. 이 경우 null은 Object 및 String 유형의 변수에 모두 할당될 수 있으므로 두 메서드 모두에 적용 가능합니다.

특수성은 지정된 인수에 대해 메서드가 얼마나 특수한지 측정합니다. 이 경우 method(String) 오버로드는 String 유형의 인수만 처리하도록 설계되었기 때문에 더 구체적입니다. 메소드(객체) 오버로드는 Object 유형 또는 해당 하위 클래스의 인수를 처리할 수 있으므로 더 일반적입니다.

따라서 컴파일러는 제공된 클래스에 더 구체적이고 적용 가능한 메소드(문자열) 버전을 선택합니다. null 참조인 인수입니다.

참고: 매개 변수 유형으로 StringBuffer를 사용하는 두 번째 오버로드된 메서드가 MoneyCalc 클래스에 추가되면 컴파일 오류가 발생합니다. 이 경우 메소드(String)나 메소드(StringBuffer) 중 어느 하나도 더 구체적이지 않아 메소드 선택이 모호해지기 때문입니다.

위 내용은 Java에서 오버로드된 메소드에 `null`을 전달하면 `String` 매개변수가 있는 메소드가 호출되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.