2014-06-21 5 views
1
public class NullDemo { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    NullDemo n = new NullDemo(); 
    n.execute(null); 

} 

public void execute(Object o) { 
    System.out.println("object"); 
} 

public void execute(Double o) { 
    System.out.println("double"); 
} 
} 

이 실행 (더블 오)가 아닌 실행 (객체 O)어떤 오버로드 된 메서드가 실행되며 그 이유는 무엇입니까?

와 가정 실행하는 이유 .I이 이유를 알 필요가 나는이 위의 코드를 실행하고 그것을 실행 (더블 오)와 방법을 실행

public class NullDemo { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    NullDemo n = new NullDemo(); 
    n.method1(null); /// give the compilation error 

} 

public void method1(Float o) { 
    System.out.println("object"); 
} 

public void method1(Double o) { 
    System.out.println("double"); 
} 
} 

내가 왜 이렇게되는지 방법 공개 무효 방법 항목 (플로트 O) 및 공공 무효의 방법 항목 (더블 오)는는 컴파일 오류를 줄 것이다 만들면? 이것은 계층 구조와 관련이 있습니까?

+0

double과 float을 구별하기가 힘들어 컴파일 오류가 발생한다고 생각합니다. 따라서 어떤 함수를 선택해야하는지 모호합니다. – mdebeus

+2

답변을 찾을 수 있습니다 : http://stackoverflow.com/questions/19243708/how-do-overloaded-methods-work/19243758#19243758 –

+1

이제 자바가 원래 태그로 사용되지 않았 음을 알았습니다. . 슬픈 시간. – Makoto

답변

1

Java는 상속 트리에서 가장 멀리있는 메소드를 호출하는 것을 선호합니다. 다음 상황을 고려하십시오.

class Demo { 

    public void doSomething(ParentClass foo) { 
     //..... 
    } 

    public void doSomething(ChildClass foo) { 
     //..... 
    } 

    public static void main() { 
     Demo demo = new Demo(); 
     demo.doSomething(new ChildClass()); 
    }  
} 

위의 상황에서 메서드 호출은 두 가지 방법 중 하나와 일치 할 수 있습니다. 그러나 두 번째 방법과 일치해야한다는 것을 직관적으로 볼 수 있습니다.

당신은 자바 사양에서 정확한 동작에 대해 읽을 수 있습니다 : 당신의 초기 코드를 감안할 때 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2

0

, (Object)에 캐스트를 추가하는 것은 당신이 무엇을 기대 인쇄됩니다. Double 다음 Objectmore specific이며이 때문에 기본적으로 호출되기 때문에이 두 가지 이상의 방법은 메서드 호출에 적용 할 수 있다면, 컴파일러는 가능하면 더 특정 하나를 선택합니다

public static void main(String[] args) { 
    NullDemo n = new NullDemo(); 
    n.execute((Object) null); 
} 

public void execute(Object o) { 
    System.out.println("object"); 
} 

public void execute(Double o) { 
    System.out.println("double"); 
} 
0

, 발생합니다. 첫 번째 예제에서 메서드는 DoubleObject의 하위 클래스이므로 더 구체적입니다. 두 번째 예에서는 Double도 아니고 Float도 다른 것의 하위 클래스가 아니므로 어느 방법도 더 구체적이지 않습니다. 두 방법 모두 적용 가능하므로 (nullDouble 또는 Float으로 작동 함) 둘 다 더 구체적이므로 컴파일러는 호출이 모호하다고보고합니다.