2016-06-16 2 views
-1

X z = new Y();은 컴파일시에 class X의 인스턴스로 z을 처리하지만 런타임에 class Y의 인스턴스로 처리한다는 것을 의미합니다.컴파일 시간/런타임 추가

그렇다면 이유 : z.method((byte)0 + (char)0);은 런타임에 처리 되었습니까? 이러한 2 개의 상수가 합산되지 않으므로 런타임 대신 컴파일 타임에 결정될 수 있습니까?

class X { 
    void method(int x) { System.out.println("X:int"); } 
} 

class Y extends X { 
    void method(int x) { System.out.println("Y:int"); } 
} 

public class Z { 
    public static void main(String[] args) { 
     X x = new X(); 
     X z = new Y(); 

     System.out.println("1:"); 
     z.method((byte)0 + (char)0); 
    } 
} 

출력 : 추가가 관련이 어떻게 표시되지 않습니다

1: 
Y:int 
+0

초보자를위한 힌트 : 이전 조사를해야합니다. 특히 자바를 처음 접해 보았을 때 :이 질문을하는 첫 번째 인물이 아닌 가능성이 매우 높습니다. 따라서 좋은 질문을 작성하기 위해 15 분을 소비하기 전에이 질문이 전에 부탁되었는지 확인하는 데 단지 몇 분이 걸렸습니다. – GhostCat

+0

알아,하지만 모든 해당 조항을 어떻게 알았습니까? – LifeisHard

+0

왜 개정 내역에 더 이상 표시되지 않는지 모르겠다. 원래 질문은 오버로드 된 메소드에 'null'을 전달하는 것이었다. –

답변

1

. int에 매개 변수를 취하는 X에 add() 메서드가 있습니다. 이 메소드는 Y에서 대체됩니다. z은 구체 유형이 Y 인 오브젝트를 참조하므로 Y에서 대체 메소드가 호출됩니다. 그것은 단순한 오래된 다형성입니다.

+0

그래, 그 마지막 문장은 불필요했지만. – LifeisHard

관련 문제