【问题标题】:Child class Changing a protected variable from a Parent class in Java子类从 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;

}

【问题讨论】:

    标签: java inheritance protected


    【解决方案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 将其编译为与类无关的代码,因此无法找到速度变量。尝试将其放入构造函数中,看看会发生什么。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-31
            • 1970-01-01
            • 2021-10-04
            • 2011-07-25
            • 1970-01-01
            • 2017-01-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多