子类在Java中从Parent类更改受保护的变量

时间:2011-10-30 00:09:09

标签: java inheritance protected

我知道在父类中拥有受保护的变量是不好的设计,因为所有子类都可以更改该值。但是,我试图测试它,但我在这里做错了。它告诉我在Truck类中找不到符号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;

}

4 个答案:

答案 0 :(得分:2)

您的 speed = 99999; 行无法按照您将其放入 Truck 类的方式生效。试着把它放在其他地方。

例如,在调用 super 之后,您可以将其放在 Truck 的构造函数中。

请注意,如果您选择了另一个名称altogher,则会遇到完全相同的错误,如下所示:

public Truck extends Vehicle {

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

    justTesting = 999999;

}

答案 1 :(得分:2)

在Java中,您不能简单地在类的中间编写指令(如speed = 999999;)。必须在方法(函数)中写入指令。你究竟是什么意思?你什么时候想要执行这个指令?

顺便说一下,当setSpeed构造函数Vehicle调用maxSpeed时尚未初始化,当您尝试比较s和{时,这会导致错误{1}}。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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