2016-10-03 3 views
3
public class Test{ 

public static void abc(String s) { 
    System.out.println("String"); 

} 

public static void abc(Object s) { 
    System.out.println("OBject"); 

} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    abc(null); 

}} 
Output-String 

저는 초보자입니다. 위의 프로그램의 출력에 대해 혼란스러워합니다. 출력 이유를 알려주십시오.출력이 "문자열"인 이유. 예기치 않은 출력

답변

1

Java 컴파일러는 가장 구체적인 오버로드 된 메소드를 선택합니다.이를 초기 바인딩이라고합니다. 여기에서 String extends Object 클래스이므로보다 구체적입니다. 하나 개 이상의 멤버 메소드는 메소드 호출에 접근 가능하고 적용 둘 경우 당신은 official Java Language Specification

를 참조 할 수 있습니다, 런타임 방법 파견에 대한 설명을 제공하기 위해 하나를 선택하는 것이 필요하다. Java 프로그래밍 언어는 가장 구체적인 메소드가 선택된다는 규칙을 사용합니다.

+0

런타임에는 수행되지 않지만 컴파일시에는 –

+0

@ErwinBolwidt 덕분에 수정했습니다. –

8

초기 (컴파일시에서 가장 구체적인 방법을 결합 ) 바인딩.

메서드를 오버로드하면 가장 구체적인 메서드가 선택됩니다. 귀하의 경우 선택 순서는 String>Object입니다 (null은 참조 유형 일 수 있음).

계층 구조에서 String은 Object보다 더 구체적입니다. 따라서 문자열이 선택되었습니다. 사실 오브젝트는 모든 자바 중 적어도 특정

객체 여기 JLS는

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5

같은

하나 개 이상의 멤버 메소드는 메소드 호출에 접근 가능하고 적용 할 수있는 모두 인 경우입니다, 런타임 메서드 디스패치에 대한 설명자를 제공하기 위해 하나를 선택해야합니다. Java 프로그래밍 언어는 가장 구체적인 메소드가 선택된다는 규칙을 사용합니다.

..... [규칙]

+0

고맙습니다. @suresh ATTA –

0

당신이 사용했던 개념이 과부하되고 Object는 자바의 모든 클래스의 슈퍼 클래스입니다. 따라서 일반적인 구현 (이 경우 Object)과 함께 특정 구현 (이 경우 String)을 제공하면 JVM은 기본적으로 특정 구현과 함께 진행됩니다. 이 경우 abc(123);

abc(null);를 교체하십시오 그것을 밖으로 시도하려는 경우가 일반화 된 하나 간다 있도록 JVM 정수에 대한 구체적인 구현을 찾을 수 는, 출력은 "개체"입니다.