다음 Java 코드를 고려하세요.
public 클래스 MoneyCalc {</p> <p>public void 메소드(객체 o) {</p> <pre class="brush:php;toolbar:false"> System.out.println("Object Verion");
}
public void 메소드(String s) {
System.out.println("String Version");
}
public static void main(String args[] ) {
MoneyCalc question = new MoneyCalc(); question.method(null);
}
}
여기서 null 값을 매개변수로 전달할 때 선택되는 오버로드된 메서드는 "method(String s )" 방법. null은 문자열 변수로 명시적으로 선언되지 않기 때문에 이는 직관에 어긋나는 것처럼 보일 수 있습니다.
"객체 버전"이라는 이름에도 불구하고 "method(Object o)" 오버로드는 객체에만 국한되지 않습니다. Java에서는 null을 String을 포함한 모든 클래스 유형의 표현식으로 변환할 수 있습니다. 따라서 다음 할당은 유효합니다.
String x = null;<br>
Java 컴파일러는 JLS(Java 언어 사양) 섹션에 따라 가장 구체적인 오버로드를 선택합니다. 15.12.2.5. 비공식적으로, 메소드에 의해 처리되는 호출이 컴파일 시간 유형 오류 없이 다른 메소드에 의해 처리될 수도 있다면 메소드가 더 구체적입니다.
이 경우 "method(String s)" 오버로드는 다음과 같은 이유로 더 구체적입니다. 문자열 인수를 사용하여 호출을 처리할 수 있습니다. 반면에 "method(Object o)" 오버로드는 null을 포함한 모든 개체 유형을 처리할 수 있습니다. 그러나 캐스팅 없이 문자열 인수가 있는 호출을 처리할 수 없으므로 컴파일 시간 오류가 발생합니다.
을 사용한 모호한 오버로드 추가 "method(StringBuffer sb)" 오버로드를 포함하도록 코드를 수정하면 모호한 오버로드가 발생합니다. 오류:
<사전>public class MoneyCalc {
public void 메서드(StringBuffer sb) {
System.out.println("StringBuffer Verion");
}
public void 메서드( 문자열) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc(); question.method(null);
}
}
이것은 "method(StringBuffer sb)"도, "method(StringBuffer sb)"도 아니기 때문입니다. "method(String s)" 오버로드는 다른 오버로드보다 더 구체적입니다. 둘 다 Null 인수를 처리할 수 있고 둘 다 캐스팅 없이 상대방의 인수 유형을 처리할 수 없습니다.
위 내용은 Java의 오버로드된 메소드 선택이 `null`을 전달하면 `method(String s)`를 선택하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!