2015-01-23 3 views
3

나는 좋은 대답을 찾을 수 없다는 간단한 질문이 있습니다. 왜 다음 Java 프로그램이 20을 표시합니까? 가능한 경우 자세한 답변을 원합니다.정적 방법 및 다형성

class Something{ 
    public int x; 
    public Something(){ 
     x=aMethod(); 
    } 
    public static int aMethod(){ 
     return 20; 
    } 
} 
class SomethingElse extends Something{ 
    public static int aMethod(){ 
     return 40; 
    } 
    public static void main(String[] args){ 
     SomethingElse m; 
     m=new SomethingElse(); 
     System.out.println(m.x); 
    } 
} 
+3

다형성은 '최종'또는 '개인'또는 '정적'이 아닌 메소드에서만 작동합니다. – Pshemo

+0

또한'SomethingElse'의'aMethod()'가'Something'의'aMethod()'를 오버라이드 시키길 원한다면'@ Override' 속성을 주어야합니다.하지만'static ' –

답변

1

정적 메서드의 상속은 비 정적 인 개체와 다르게 작동합니다. 특히 수퍼 클래스 정적 메서드는 하위 클래스에서 재정의되지 않습니다. 정적 메서드 호출의 결과는 호출되는 개체 클래스에 따라 다릅니다. 변수 x는 Something 개체 생성 중에 만들어 지므로 클래스 (Something) 정적 메서드가 호출되어 해당 값을 결정합니다.

다음 코드를 고려 : 각 개체 클래스가 자신의 정적 메서드를 호출하는 40, 20로 제대로 인쇄됩니다

public static void main(String[] args){ 
    SomethingElse se = new SomethingElse(); 
    Something  sg = se; 
    System.out.println(se.aMethod()); 
    System.out.println(sg.aMethod()); 
} 

. Java documentation은 숨기기 정적 메서드 부분에서이 동작을 설명합니다.

8

다형성은 인스턴스 메소드에만 적용되기 때문에.

여기

public Something(){ 
    x=aMethod(); 
} 

를 호출 aMethodstatic 방법은 Something에서 선언 된 aMethod를 말합니다.

0

int x가 Something 클래스에 선언 되었기 때문에. SomethingElse 개체를 만들 때는 먼저 Something 개체를 만듭니다.이 개체는 x를 설정해야하며 SomethingElse (Something을 생성하므로) 대신 Something에서 aMethod()을 사용합니다. 이것은 aMethod()가 정적이고, 정적 메소드에 대해 다형성이 작동하지 않기 때문입니다. 그런 다음, m에서 x를 인쇄 할 때 x 값을 변경하지 않았으므로 20을 인쇄합니다.