#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 компилирует его как код, не связанный с классом, и, следовательно, переменная скорости не может быть найдена. Попробуйте поместить его в конструктор и посмотреть, что произойдет.