use*_*527 7 java variables subclass superclass
好的,例如,假设我有一个名为"Vehicle"的抽象类.除了其他方面,Vehicle类还有一个名为wheels的静态变量,它没有被初始化.我想要做的是从Vehicle类扩展其他子类,如"Motorcycle"和"Truck",并在这些子类中初始化轮子.
码:
public abstract class Vehicle {
static int wheels; //number of wheels on the vehicle
}
Run Code Online (Sandbox Code Playgroud)
但以下不起作用:
public class Motorcycle extends Vehicle {
wheels = 2;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法有效地做到这一点?
编辑:感谢所有回复的人.我认为制作实例可能是一种更好的方法,而不是将它们全部放在不同的类中,但我没有完全得到java的"静态"部分,所以我需要一些帮助.
我正在尝试为我的程序做的是为摩托车和卡车类提供单独的精灵,我希望它们是静态的,这样我每次创建摩托车或卡车的实例时都不必重新加载图像.除此之外,它们将具有几乎相同的属性,这就是为什么它们都将从Vehicle超类扩展.
我可以看到这样做的唯一另一种方法是不在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
}
Run Code Online (Sandbox Code Playgroud)
Lee*_*dor 12
如果"车轮"是静止的,则只有一个,它将同时适用于所有车辆.因此,三轮车,摩托车,18轮卡车和福特都将拥有相同数量的车轮.
这对我来说没有意义.最好让'wheels'成为父类中的实例变量,但每个子类都适当设置.
但你可以试试
Vehicle.wheels = 2;
Run Code Online (Sandbox Code Playgroud)
注意:自从您添加到问题中后,我正在添加我的答案.
我喜欢你在每个子类中都有静态的想法.但你应该把它们变成私人的.然后把一个抽象方法放在父类(Vehicle)中
public abstract BufferedImage getSprite();
Run Code Online (Sandbox Code Playgroud)
然后每个直接子类必须具有相同的方法,并且它可以返回私有静态变量.
使变量保持静态,因此您只需加载一次.将它们设为私有,以便类本身之外的代码不会愚弄它并引入错误.如果可能的话,你可以让它们成为'final',这样类中的代码就不能在事后改变它并引入bug.(一个'最终'变量不能改变它的值,但它的值的内容可能会改变.所以'最终'不是很好,因为它可能.)
你要做的事情从根本上是有缺陷的.你可以做Motorcycle初始化wheels一次:
// Static initializer
static
{
wheels = 2;
}
Run Code Online (Sandbox Code Playgroud)
...或每次创建实例时:
// Instance initializer
{
wheels = 2;
}
Run Code Online (Sandbox Code Playgroud)
但是,这只是一个变量而不是一个为- Motorcycle,一个Truck如果你没有两个同样的事情等等Truck和Motorcycle,然后取其最后将"赢"初始化.
目前尚不清楚你想如何使用这个字段 - 但是如果你只有一个静态字段,那么它只会有一个值 - 而不是每个子类一个.
| 归档时间: |
|
| 查看次数: |
29352 次 |
| 最近记录: |