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