메소드 오버로딩 및 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!