2014-12-17 3 views
5

자바로 작업 한 이후로 꽤 오래간만에 꽤 많은 경험이 있습니다. 대부분 상위 레벨의 특정 언어, 스크립팅 언어 및 정렬로 작성하는 경우가 대부분입니다.하위 클래스의 변수 값 변경?

클래스 구성원의 기본값을 지정하는 개념을 이해하지 못한다고 가정합니다.

// parent 
public class A { 
    protected int value = 0; 
    public void print() { 
     System.out.println(value); 
    } 
} 

// child class 
public class B extends A { 
    int value = 1; 
} 

짧게 유지는, B의 인스턴스를 생성하고() 인쇄를 호출하면

I "는 일반적인 식별자의 일종 인보다는 가정 A. 설정"값 "의 원래 값을 출력 이 객체가 소유 한 'value'라는 변수는 "A에 정의 된 함수는 B보다"값 "에 대해 완전히 다른 컨텍스트를가집니다.

특정 클래스의 공통 변형을 구성하지만 해당 클래스의 하위를 만드는 다른 방법은 있습니까? 어떤 종류의 팩토리 객체입니까? 클래스의 모든면을 재정의해야하므로 인터페이스가 답이 아닌 것 같아요. 그래서 그렇게하지 않아도됩니다.

도움을 주시면 감사하겠습니다.

+2

선언'값 ':

여기에 자세한 내용입니다.'B'에 대한 생성자를 만들고 거기에'value = 1'을 설정해야합니다. – azurefrog

+3

자세한 내용은 [필드 숨기기] (http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html)를 참조하십시오. – azurefrog

+0

필드 숨기기가이 질문의 범인이 아닙니다. 필드 숨김으로 B.value는 A.value를 숨 깁니다. 대신 영업 담당자는 A.value를 얻고 B.value를 예상합니다. –

답변

6

하위 클래스 필드는 수퍼 클래스 필드를 덮어 쓰지 않습니다.

아래와 같이 생성자를 통해 기본값을 설정할 수 있습니다.

// parent 
public class A { 
    private int value = 0; 
    public A(int initialValue) { 
     value = initialValue; 
    } 

    public void print() { 
     System.out.println(value); 
    } 
} 

// child class 
public class B extends A { 
    public B() { 
     super(1); 
    } 
} 

또한 대부분의 경우 보호 된 필드를 피하면 수명이 더 짧아집니다.

보호 된 필드는 다른 클래스에 의한 액세스 및 수정을 위해 데이터를 열고 그 중 일부는 제어 할 수 없습니다. 빈약 한 캡슐화는 버그를 허용하고 수정을 금지 할 수 있습니다. Java tutorials on access control에서 제안 된대로 :

"특정 회원에게 가장 제한적인 액세스 수준을 사용하고, 그렇지 않은 경우에는 사적인 용도로 사용하십시오."

+0

"보호 된 필드를 피하면 대부분의 경우 인생이 쉬워 질 것입니다." 이것은 사실 일지 모르지만 더 많은 설명이 필요할 것입니다. – dnault

+0

@dnault - 설명을 추가했습니다. 아이디어를 가져 주셔서 감사합니다. –

+0

이것은 내가 몇 분만 들떠 나온 결론이었습니다. 나는 객체를 생성하는 동안 값을 설정해야한다는 생각을 싫어한다. 왜냐하면 하위 클래스의 멤버를 재정의하는 데 익숙해 졌기 때문에 값을 무시하지만 객체 지향 패러다임이 필요하다고 생각하기 때문이다. 둘 중 하나를 무시하게하지 않으시겠습니까?). 의견을 보내 주셔서 감사합니다. – milkmanjack

4

@ user2038045 - 좋은 질문.

당신의 혼란의 소스는 자바로, 서브 클래스가 방법을 대체 할 수 있습니다 ...하지만 멤버 변수를 무시할 수 없다는 것입니다.

클래스 B가 자신의 "print()"메소드를 가지고 있다면 - 예상 한 동작을 보게 될 것입니다. B.print()는 을 덮어 쓰고 A.print()를 재정의합니다.

클래스 B에 "값"에 액세스하는 다른 방법이 있다면 예상했던 동작이 다시 나타납니다. B.value는 A.value를 숨기고 B.someOtherMethod()는 B.value에 액세스합니다.

귀하의 경우 A.print() ...를 호출하여 A.value에 액세스합니다. B`가 A``에서`값 '을 숨기고`에서

Is there a way to override class variables in Java?

+0

설명해 주셔서 감사합니다. – milkmanjack

관련 문제