2017-11-19 8 views
2

나는 Variables doesn't exhibit polymorphic behavior을 알고 있으며 그 방법이 제한적입니다. 그러나 아래 코드는 객체 유형을 반환하는 데 약간 혼란 스럽습니다.재정의 된 메서드가 다형성 동작을 나타내지 않는 이유는 무엇입니까?

자식 메서드를 호출하면 (즉, 오른쪽) 자식 개체를 반환한다는 것을 의미합니다. 그렇다면 왜 자식 변수의 값을 출력하지 않을까요?

class Parent { 

    int var = 11; 

    public Parent getInstance() { 
     System.out.println("In Parent ..."); 
     return new Parent(); 
    } 
} 

class Child extends Parent { 

    int var = 22; 

    public Child getInstance() { 
     System.out.println("In Child ..."); 
     return new Child(); 
    } 
} 


public class VariableHiding { 

    public static void main(String[] args) { 
     Parent p = new Child(); 
     System.out.println(p.getInstance().var); // something's fishy? 
    } 
} 


// Output : In Child ... 11 

PS : (변수 다형성에 참여하지,하지만 여기에 언급 된 사람이 자식 OBJ의 객체를 반환하고 obj가 자신 대신에 부모의 VAR 보유에 대해 이야기) this one의 그것하지 중복

답변

0

p.getInstance()의 반환 형식의 컴파일 타임 유형 Parent입니다 p 때문에, Parent이며, ParentgetInstance() 방법은 Parent를 반환합니다.

Parent p = new Child(); 
Child c = p.getInstance(); 

컴파일을 통과하지 것이다 : 당신은 당신이 쓰는하려고하면 것을 알 수 있습니다

.

따라서 p.getInstance().varParent 클래스의 인스턴스 변수를 반환합니다.

Child p = new Child(); 
System.out.println(p.getInstance().var); 
+0

하지만 p.getInstance()는 CHILD 객체로 평가됩니다. 맞습니까? –

+0

@ 런타임 유형은 컴파일 타임 유형이 아닌 하위입니다. – Eran

0

런타임 :

System.out.println(((Child)p.getInstance()).var); 

또는 pChild의 유형을 변경 :

Child 클래스의 인스턴스 변수를 얻기 위해, 당신은 캐스팅 p.getInstance()Child을해야합니다 다형성을 변수로 사용할 수 없습니다. 그래서 class Parent and Child에는 모두 공통 변수 var이 있습니다. 항상 수퍼 클래스 변수를 참조 할 .SO (상위 클래스의 타입이다)로 불리는이 class Childp에서

Parent p = new Child(); 

. 라인

Parent p=new Child(); 

없는 아이, 부모 참조 선언되었으므로

0

출력은 11 대신 22이다. 이것은 합법적입니다 (자식은 부모). 그러나 변수 var의 관점에서 볼 때 하위 개체로 비용이 계산 된 경우에도 개체는 부모로 간주되므로 하위 개체에 쓰여진 값은 고려되지 않습니다. desidered 같이 변수 VAR은 다음 방법

class Parent { 

    protected int var; 

    Parent(){ var=11;} 

    public Parent getInstance() { 
     System.out.println("In Parent ..."); 
     return new Parent(); 
    } 
} 

class Child extends Parent { 

    Child(){ var=22;} 

    public Child getInstance() { 
     System.out.println("In Child ..."); 
     return new Child(); 
    } 
} 

이번에 결과가 22 같은 기본 기능을 사용하여 상기 costructors 내에 정의 된 경우, 값 (11)에 정의 때문에
이야기는 완전히 다른 것이다 부모의 costuctor는 Child의 costructor에 정의 된 값으로 대체됩니다.