2010-06-13 7 views
16

나는이 다음 코드 :
이 Java 코드에 대한 설명은 무엇입니까?

public class Main { 
    public void method(Object o) 
    { 
      System.out.println("Object Version"); 
    } 
    public void method(String s) 
    { 
      System.out.println("String Version"); 
    } 
    public static void main(String args[]) 
    { 
      Main question = new Main(); 
      question.method(null);//1 
    } 
} 

이 결과가 "문자열 버전"입니다 왜? 첫 번째 메서드가 StringBuffer 개체를 사용하는 경우 왜 컴파일러 오류가 발생합니까?
또 다른 경우 : 첫 번째 메소드가 StringBuffer 객체를 취하고 question.method("word");이라고 쓰면 결과는 "문자열 버전"이됩니다. 왜 ? 컴파일러 오류가없는 이유는 무엇입니까?

+0

호기심. 나는 컴파일러가 불만을 기대했지만, 아마도 두 개의 인수 클래스 ('String'이 더 구체적 임) 사이에 형식 관계가 있다는 사실이 JLS의 경우 일 수 있습니다. 'StringBuffer' 대/소문자는 분명 모호하기 때문에 쉽습니다. –

+1

@third 질문 : 물론 오류는 발생하지 않을 것입니다. String을 전달하고 있으므로 String 매개 변수가있는 메소드가 분명히 호출됩니다. 컴파일러가 혼란스러워할만한 것은 없습니다. – someguy

답변

23

JAVA 사양에서는 이와 같은 경우 가장 구체적인 기능이 호출됩니다. String는 Object의 하위 유형이므로 두 번째 메소드가 호출됩니다. Object를 StringBuffer로 변경하면 StringBuffer가 String의 하위 유형이 아니기 때문에 특정 메소드가 없으며 그 반대의 경우도 있습니다. 이 경우 컴파일러는 호출 할 메소드를 알지 못하므로 오류가 발생합니다.

1

다른 케이스를보고있는 경우 :

package com.snamellit; 첫 번째 방법은 StringBuffer와를 tqkes 및 제 문자열 "단어"가능한 혼란이없는 경우

public class Main { 
    public void method(Object o) { 
     System.out.println("Object Version"); 
    } 

    public void method(String s) { 
     System.out.println("String Version"); 
    } 

    public static void main(String args[]) { 
     Main question = new Main(); 
     question.method("word"); 
    } 
} 

은 문자열 아닌 StringBuffer를이다.

Java에서 함수/메소드의 신원은 이름, 매개 변수 유형 (별칭 시그니처 서명) 및 클래스 로더의 세 가지에 의존합니다. 두 형식 모두 다른 인수 서명을 가지므로 컴파일러는 올바른 인수를 쉽게 선택할 수 있으며 오류가 발생하지 않습니다.

+0

하지만 그것은 오류를 생성합니다 : 당신은 더 자세히 설명 할 수 있습니까, 피터? –

+0

감사합니다 Peter.I "word"는 유효한 StringBuffer 값이므로 컴파일러 오류가 발생한다고 생각합니다. –

+2

아니요, StringBuffer가 아니라 String입니다. StringBuffers는 문자열의 변경 가능한 사촌이며, 따라서 리터럴 문자열의 훌륭한 모델입니다. 현명한 사람은 "의심 스러울 때 시험해보십시오"라고 말하면 : System.out.println ("word".getClass(). getName())은 java.lang.String을 인쇄합니다. –

관련 문제