Дочерний класс, изменяющий защищенную переменную из родительского класса в Java

#java #inheritance #protected

#java #наследование #защищенный

Вопрос:

Я знаю, что иметь защищенную переменную в родительском классе — плохой дизайн, потому что все дочерние классы могут изменять это значение. Тем не менее, я пытался проверить это, но здесь я делаю что-то не так. Он говорит мне, что не может найти символ speed = 999999; в классе Truck. Я думал, что дочерний класс имеет доступ к защищенной переменной speed в родительском классе.

 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;

}
 

Ответ №1:

Ваша строка speed = 99999; недопустима в том виде, в котором вы разместили ее в классе Truck . Попробуйте поместить его куда-нибудь еще.

Вы могли бы, например, просто для целей тестирования поместить его в конструктор Truck после вызова super .

Обратите внимание, что у вас была бы точно такая же ошибка, если бы вы выбрали другое имя, например:

 public Truck extends Vehicle {

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

    justTesting = 999999;

}
 

Ответ №2:

В Java вы не можете просто писать инструкции (например speed = 999999; ) в середине класса. Инструкции должны быть написаны внутри метода (функции). Что на самом деле вы имели в виду? Когда вы хотите, чтобы эта инструкция была выполнена?

Кстати, when setSpeed вызывается Vehicle конструктором maxSpeed , еще не инициализирован, что приведет к ошибке при попытке сравнить s и maxSpeed .

Ответ №3:

Вы пытаетесь получить доступ к переменной вне тела метода, она должна быть в конструкторе или методе дочернего класса, чтобы вы могли получить к ней доступ так, как вы хотите.

Ответ №4:

На мой взгляд, защищенные переменные не должны быть плохими. В некоторых случаях это действительно может быть необходимостью. Но это зависит от дизайна, конечно 🙂

В этом случае я думаю, что это имеет смысл. И вы должны иметь возможность изменять speed значение в классе Truck. Проблема здесь (вероятно) в том, что строка speed = 999999; не помещается внутри метода в классе. Возможно, я ошибаюсь, но мне кажется, Java компилирует его как код, не связанный с классом, и, следовательно, переменная скорости не может быть найдена. Попробуйте поместить его в конструктор и посмотреть, что произойдет.