子类从 Java 中的父类更改受保护的变量
Posted
技术标签:
【中文标题】子类从 Java 中的父类更改受保护的变量【英文标题】:Child class Changing a protected variable from a Parent class in Java 【发布时间】:2011-10-30 00:09:08 【问题描述】:我知道在父类中有一个受保护的变量是不好的设计,因为所有子类都可以更改该值。但是,我试图对其进行测试,但我在这里做错了。它告诉我在卡车类中找不到符号speed = 999999;
。我以为子类可以访问父类中的受保护变量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;
)。指令必须写在方法(函数)中。你到底是什么意思?您希望何时执行此指令?
顺便说一句,当setSpeed
被Vehicle
构造函数调用时,maxSpeed
还没有初始化,当你尝试比较s
和maxSpeed
时会导致错误。
【讨论】:
【参考方案3】:您正在尝试访问方法体之外的变量,它需要位于子类的构造函数或方法中,以便您以所需的方式访问它。
【讨论】:
【参考方案4】:在我看来,受保护的变量不一定是坏事。在某些情况下,它确实是必需品。但这当然取决于设计:)
在这种情况下,我认为这是完全合理的。您应该能够更改 Truck 类中的 speed
值。这里的问题是(可能)speed = 999999;
行没有放在类的方法中。我可能是错的,但在我看来,Java 将其编译为与类无关的代码,因此无法找到速度变量。尝试将其放入构造函数中,看看会发生什么。
【讨论】:
以上是关于子类从 Java 中的父类更改受保护的变量的主要内容,如果未能解决你的问题,请参考以下文章