오버로드 해결: Null 리터럴 해석
Java에서 Null 리터럴은 모든 개체 변수에 할당할 수 있는 유효한 참조입니다. , String과 같은 참조 유형을 포함합니다. 이 동작은 매개변수가 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 리터럴인 경우 Java 컴파일러는 메서드(Object o) 오버로드 대신 메서드(String s) 오버로드를 선택합니다. 이 동작은 가장 구체적인 오버로드 해결의 원칙으로 설명됩니다.
JLS(Java 언어 사양)에 따라 컴파일러는 "가장 구체적인" 오버로드를 선택합니다. 컴파일 타임 유형 오류 없이 호출이 전달될 수 있습니다." 여기서 null 리터럴은 메소드(String s) 오버로드에는 오류 없이 전달될 수 있지만 메소드(Object o) 오버로드에는 전달되지 않습니다.
따라서 Java 컴파일러는 메소드(String s) 오버로드를 선택합니다. , 프로그램의 출력은 "String Version"입니다.
그러나
... public void method(StringBuffer sb) { System.out.println("StringBuffer Verion"); } ...
StringBuffer 매개 변수를 허용하기 위해 세 번째 오버로드가 추가되면 코드가 컴파일되지 않습니다. 이는 이제 메서드(String s) 및 메서드(StringBuffer sb) 오버로드가 모두 동일하게 구체적이어서 모호성이 발생하고 컴파일러가 가장 적절한 오버로드를 선택하지 못하기 때문입니다.
위 내용은 메소드 오버로드에 Null을 전달하면 객체 버전 대신 문자열 버전이 선택되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!