2011-10-30 3 views
3

모든 하위 클래스에서 해당 값을 변경할 수 있으므로 부모 클래스에서 보호 된 변수를 사용하는 것은 좋지 않은 디자인이라는 것을 알고 있습니다. 그러나, 나는 그것을 시험해보고자했지만 나는 여기서 잘못된 것을하고있다. Truck 클래스에서 기호 speed = 999999;을 찾을 수 없다는 것을 알려줍니다. 하위 클래스가 부모 클래스의 보호 된 변수 speed에 액세스 할 수 있다고 생각했습니다.자식 클래스 Java에서 부모 클래스의 보호 된 변수 변경

public class Vehicle { 
    protected double speed; 
    protected double maxSpeed; 

    public Vehicle(double speed, double maxSpeedIn) throws InvalidDataException{ 
     setSpeed(speed); 
     maxSpeed = maxSpeedIn; 
    } 

    public void setSpeed(double s) throws InvalidDataException { 
     if (s < 0.0) { 
      throw new InvalidDataException("Negative speed is not valid"); 
     } 
     if (s > maxSpeed) { 
      throw new InvalidDataException("Speed cannot exceed maximum spped:"); 
     } 
     speed = s; 
    } 


} 

public class Truck extends Vehicle { 

    public Truck(double speedin, double maxSpeedin) throws InvalidDataException { 
     super(speedin,maxSpeedin); 
    } 

    speed = 999999; 

} 

답변

2

속도 = 99999; 행은 트럭 클래스에 배치 한 방법과 다릅니다. 어딘가에 넣어보십시오.

당신은 예를 들어, 당신의 테스트 목적을 위해, 슈퍼에 호출 후, 트럭의 생성자 내부에 넣을 수 있습니다. 다른 이름 altogher을 선택했습니다 경우이 같은 동일한 오류가 있었다 것

참고 :이 방법 본체의 외부 변수에 액세스하려고

public Truck extends Vehicle { 

    public Truck(double speedin, double maxSpeedin) throws InvalidDataException { 
     super(speedin,maxSpeedin); 
    } 

    justTesting = 999999; 

} 
+0

지금 고맙습니다! – Dan

1

, 그것은 할 필요가 자식 클래스의 생성자 또는 메서드에서 원하는 방식으로 액세스 할 수 있습니다.

2

Java에서는 클래스 중간에 지침 (예 : speed = 999999;)을 쓸 수 없습니다. 지침은 방법 (기능) 내에 작성되어야합니다. 실제로 무슨 뜻이야? 언제이 명령을 수행하기를 원하십니까? setSpeed는 당신이 smaxSpeed을 비교하려고 할 때 오류가 발생합니다 maxSpeed 아직 초기화되지 않은 Vehicle 생성자에 의해 호출되는 방식으로

.

+0

그래, 나는 계속 maxSpeed ​​오류 검사를 계속해서 알아 차렸다. – Dan

1

제 생각에는 보호 된 변수가 반드시 나쁜 것은 아닙니다. 어떤 경우에는 정말 필수적 일 수 있습니다. 하지만 그것은 물론 디자인에 달려 있습니다 :)

이 경우에는 완벽하다고 생각합니다. 그리고 Truck 클래스의 speed 값을 변경할 수 있어야합니다. 여기서 문제는 (아마도) speed = 999999; 라인이 클래스의 메소드 안에 있지 않다는 것입니다. 내가 틀렸을 수도 있지만 자바에 클래스와 관련없는 코드로 컴파일되므로 속도 변수를 찾을 수 없습니다. 생성자에 넣고 무슨 일이 일어나는 지보십시오.

관련 문제