子类从 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;)。指令必须写在方法(函数)中。你到底是什么意思?您希望何时执行此指令?

顺便说一句,当setSpeedVehicle构造函数调用时,maxSpeed还没有初始化,当你尝试比较smaxSpeed时会导致错误。

【讨论】:

【参考方案3】:

您正在尝试访问方法体之外的变量,它需要位于子类的构造函数或方法中,以便您以所需的方式访问它。

【讨论】:

【参考方案4】:

在我看来,受保护的变量不一定是坏事。在某些情况下,它确实是必需品。但这当然取决于设计:)

在这种情况下,我认为这是完全合理的。您应该能够更改 Truck 类中的 speed 值。这里的问题是(可能)speed = 999999; 行没有放在类的方法中。我可能是错的,但在我看来,Java 将其编译为与类无关的代码,因此无法找到速度变量。尝试将其放入构造函数中,看看会发生什么。

【讨论】:

以上是关于子类从 Java 中的父类更改受保护的变量的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在父类的帮助下访问不同包中的受保护变量吗?

在 kotlin 中,如何从子类访问父类中受保护的静态成员

父类可以看到子类受保护的变量吗?

为啥我不能访问子类中的受保护变量?

无法访问kotlin子类中的父类变量

Java中的多态