好的,例如,假设我有一个名为“Vehicle”的抽象类。 Vehicle 类有一个名为 wheels 的静态变量,它没有被初始化。我想要做的是从 Vehicle 类扩展其他子类,如“摩托车”和“卡车”,并在这些子类中初始化车轮。
代码:
public abstract class Vehicle {
static int wheels; //number of wheels on the vehicle
}
但以下不起作用:
public class Motorcycle extends Vehicle {
wheels = 2;
}
有没有办法有效地做到这一点?
编辑: 感谢到目前为止所有回复的人。我知道创建实例可能是比将它们全部放在单独的类中更好的方法,但是我没有完全理解 java 的“静态”部分,所以我在这里需要一点帮助。
我想为我的程序做的是为摩托车和卡车类提供单独的 Sprite ,我希望它们是静态的,这样我就不必在每次创建一个实例时都重新加载图像摩托车或卡车。但除此之外,它们彼此具有几乎相同的属性,这就是它们都从 Vehicle 父类(super class)扩展的原因。
我能看到的唯一其他方法是不在 Vehicle 类中声明 sprite 变量,而是在 Motorcycle/Truck 类中声明,如下所示:
public abstract class Vehicle {
//Other coding
}
public class Motorcycle extends Vehicle {
static BufferedImage sprite = //initialize image
//Other coding
}
public class Truck extends Vehicle {
static BufferedImage sprite = //initialize image
//Other coding
}
最佳答案
如果'wheels' 是静态的,则只有一个,它将同时应用于所有车辆。因此,三轮车、摩托车、18 轮卡车和福特汽车的车轮数量都相同。
这对我来说没有意义。最好让“wheels”成为父类中的实例变量,但每个子类都适当设置。
不过你可以试试
Vehicle.wheels = 2;
注意:自从您添加到您的问题后,我正在添加我的答案。
我喜欢你在每个子类中都有静态的想法。但是您应该将它们设为私有(private)。然后在父类(Vehicle)中放一个抽象方法,如
public abstract BufferedImage getSprite();
然后每个直接子类都必须有相同的方法并且它可以返回私有(private)静态变量。
将变量设为静态,这样您只需加载它们一次。将它们设为私有(private),这样类本身之外的代码就无法欺骗它并引入错误。如果可能的话,您可以将它们设为“最终版”,这样类中的代码本身就无法在事后更改它并引入错误。 (“final”变量不能更改其值,但其值的内容可以更改。因此“final”并不像它应该的那样美妙。)
关于Java——在子类中初始化父类(super class)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076730/