2017-12-05 24 views
17

그래서 몇 가지 코드 스 니펫으로 테스트하여 상속 개념을 고수했습니다.왜 유형을 변경하면 회원이 다른 용도로 사용됩니까?

그래서 제 I이 간단한 코드를 테스트 하였다

public class Main{ 
    public static void main(String[] args) { 
     Bar bar = new Bar(); 

     System.out.println("age = " + bar.age); 

     bar.test(); 
    } 
} 

class Foo{ 
    int age = 2; 

    void test(){ 
     System.out.println("TEST FOO"); 
    } 
} 

class Bar extends Foo{ 
    int age = 4; 

    void test(){ 
     System.out.println("TEST BAR"); 
    } 
} 

및 I 예상대로 출력이었다

이어서
age = 4 
TEST BAR 

가 나는 형태를 변경 선로 (3)에 작은 변화를 만들어 Bar이 같은 Foo에 : 나는 대구를 실행 이제

Foo bar = new Bar(); 

전자는, 내가 생각 출력이 이상한 나에게 제공합니다

age = 2 
TEST BAR 

bar.test(); 여전히 방법을 사용하는 동안 코드 bar.age 지금, (의미가)에 Foo 클래스의 age 멤버를 사용하는 일이 발생할 않는 방법 Bar 클래스 (Foo가 아닌 유형이 무엇인지)?

+2

https://stackoverflow.com/questions/12589274/slight-confusion-regarding-overriding-where-variables-are-concerned 또는 https://stackoverflow.com/questions/10722110/overriding-member-variables-in -java –

+0

@RC. 재미있는 독서가 그걸 찾고있었습니다. 감사. – moffeltje

+1

기술적 측면과 함께 : 이렇게하는 것은 가장 중요한 OO 원칙을 위반하기 때문에 ** OOP가 아닙니다 ** 정보 숨기기/캡슐화 *입니다. –

답변

22

ageBar에서 그림자Fooage.

또한 필드는 이 아니며 다형성 (cf. 함수 참조)입니다. 당신이 Foo bar = new Bar();, bar정적 유형 필드 age 접근 전화 test() 중 어느 것이 우선 결정할 때 2를 반환하고 bar동적 유형을 사용할 때 사용된다을 쓸 때

그래서 그건 a Bar 유형.

+0

나는'age = 2'를 출력한다는 것을 알고 있습니다. 하지만 여전히 나는'Bar.test(); '를 호출하는 이유를 알지 못합니다. 반면 op 타입은'Foo'입니다. – moffeltje

+0

@moffeltje : 추가했습니다. 함수는 다형성입니다. – Bathsheba

4

두 개의 다른 연령 필드가 각 클래스에 하나씩 정의되었으므로 필드는 무시되지 않습니다.