我正在模拟一个停车场应用程序。有一个类Vehicle
,它是抽象的,并由Car
、Truck
等具体类扩展。我有一个变量parkingFare
,对于Vehicle
的每个子类,它将被实例化为类变量和最终类,以便该特定类的所有实例都可以使用相同的值。例如,如果我将Car
的parkingFare
设置为$2,则它对于Car
的所有实例应该是相同的。问题是我无法在我的具体类中访问这个变量作为类变量。
public abstract class Vehicle {
String plateNo;
LocalTime startTime;
static int parkingFare;
public abstract int getFare();
public abstract String getPlateNo();
public abstract LocalTime getParkedTime();
}
public class Car extends Vehicle {
final parkingFare = 2; // how I want to instantiate it.
public Car(String plateNo){
this.plateNo = plateNo;
this.startTime = LocalTime.now();
}
@Override
public LocalTime getParkedTime(){
return startTime;
}
@Override
public String getPlateNo(){
return plateNo;
}
@Overrid
public int getFare(){
return parkingFare;
}
}
在您的子类中使用此选项
static {
parkingFare=10;
}
由于静态变量与不在实例中的类相关,因此类的所有实例都将共享静态变量。
因此,在初始化parkingFare=10
之后,Class Car
的所有实例将具有相同的停车费。
现在进入您的评论,您需要使它们在子类中成为final,您不能,如果您想使它们成为final
,您需要在Vehicle Class
中将parkingFare
声明为final本身
使用静态块:
public class Car extends Vehicle {
static {
parkingFare = 2;
}
// ...
}
然而,这使得停车费在所有车辆类别中都是相等的,无论子类别如何。例如,有另一个车辆子类Bus设置parkingFare=10并运行:
Car car = new Car("Car");
Bus bus = new Bus("Bus");
System.out.println(car.getFare());
System.out.println(bus.getFare());
结果10次打印两次。
将parkingFare添加到每个子类将解决此问题。
(双重编辑:与java如何存储静态变量混淆,但后来我进行了测试,目前的描述是准确的)
我认为如果您想让汽车花费2$,那么您应该将静态最终变量移动到该类。
public abstract class Vehicle {
String plateNo;
LocalTime startTime;
public abstract int getFare();
public abstract String getPlateNo();
public abstract LocalTime getParkedTime();
}
public class Car extends Vehicle {
static final int parkingFare = 2;
...
@Override
public final int getFare() {
return parkingFare;
}
}