2010-02-10 3 views
4

:상속과 클래스 멤버 GIVEN

class A 
{ 
    String s = "A"; 
} 

class B extends A 
{ 
    String s = "B"; 
} 

public class C 
{ 
    public static void main(String[] args){ new C().go();} 
    void go() 
    { 
     A a = new B(); 
     System.out.println(a.s); 
    } 
} 

질문 : JVM 뒤에 역학이 코드는 무엇을

를 실행하는? 어떻게 a.s가 "A"로 인쇄됩니까? 지역 변수는 A 형의 즉

때문에 컴파일시에 컴파일러는 A의 필드를 참조하고 있으므로

+0

다른 응답 이외에도 B의 멤버에게 B를 전달하지 않고 a를 사용하는 액세스가 없다는 점에 유의하십시오. ((B) a) .s –

답변

4

필드 참조, 다형성 대상이 아닌, 필드 동작 방법에 대한 자바 과부하 행동처럼 , 자바 무시 동작이 아닙니다.

+0

답변 해 주셔서 감사합니다. 다음과 같이 응답에서 명확하게 설명 할 수 있습니다. [1] 런타임 및 컴파일 시간에 "a"가 보유하는 차이점이 있습니까? [2] 코드의 어느 시점에서 실제 오버로드 메커니즘이 발생합니까? – Krolique

+0

오류 : 수정 : [2] .... 실제 필드 "오버로드"메커니즘이 발생합니까? =) – Krolique

+0

@Krolique, A는 컴파일 타임에 실제로 아무것도 저장하지 않습니다 (단지 정의 일 뿐이며 실행 된 코드가 아닙니다). 오버로드는 클래스 B에서 변수 s를 정의 할 때 발생합니다.이 시점에서 두 개의 다른 클래스에 같은 이름의 두 필드가 있습니다. 컴파일러는 코드에서 참조 할 항목을 결정하는 컴파일러입니다. 그것은 역동적이지 않습니다. – Yishai

1

이것은 다형성이 아닙니다 (태그가 지정됨). 즉 당신이 속성을 재정의하지 않습니다 - - 당신이 그것을 숨길

자바하지 가상 멤버 변수, virtual methods 있습니다.

+1

그것은 재산이 아니라 현장입니다. –

+0

및 멤버 변수 용어가 엄격하지 않습니다 – Bozho

+0

답장을 보내 주셔서 감사합니다. 나는 가상 (상속받은?) 메소드와 멤버 사이의 미묘한 차이점을 놓쳤다. – Krolique

2

개체의 런타임 유형을 기반으로하는 동적 디스패치로 필드를 메서드처럼 재정의해야합니다.

Java 작동 방식이 아닙니다. 필드는 무시되지 않고 숨겨져 있습니다. 즉, 클래스 B의 객체는 두 개의 필드에 "s"라는 필드가 있지만 액세스되는 객체는 컨텍스트에 따라 다릅니다.

이유는 다음과 같습니다. 유형이 다른 경우 작동하게하는 유용한 방법이 없기 때문에 필드를 대체하는 것이 실제로 의미가 없으며, 유형이 동일 할 때 간단히 포인트가 없습니다. 수퍼 클래스 필드 만 사용할 수 있습니다). 개인적으로, 나는 그것이 단순히 컴파일러 오류라고 생각한다.

+0

답장을 보내 주셔서 감사합니다. 내가 컨셉을 정확하게 파악했는지 확인하십시오. 문맥은 선언 된 타입을 의미합니까? 업 캐스팅이 가능하고 다음을 수행했는지를 설명합니다. B b = new A(); b.s는 "B"를 인쇄해야합니까? – Krolique

+0

그게 가능하지 않기 때문에 인쇄해야 할 것이 무엇인지 논증하는 것은 다소 무의미하지만, 그렇습니다. 그것이 기본 아이디어입니다. –

+0

고맙습니다. 제 생각에는 이것이 많은 것을 명확히 해줍니다. – Krolique

0

멤버 변수는 기본 클래스에서 상속되지만 다형 적으로 호출되지는 않습니다 (즉, 동적 호출은 멤버 변수에 적용되지 않습니다).

따라서 a.s는 파생 클래스가 아닌 기본 클래스의 멤버를 참조합니다.

그런 말로하면 코드는 OO 원칙을 따르지 않습니다. 클래스의 멤버는 비즈니스 사용 사례에 따라 비공개/보호 (공개 또는 기본값이 아님)해야하며 멤버의 값을 가져오고 설정하기위한 공개 메서드를 제공해야합니다.

+0

답변 해 주셔서 감사합니다. 모든 정상적인 상황에서 나는 당신이 제안한대로 할 것입니다. – Krolique