如何将子类中的超类静态变量实例化为final



我正在模拟一个停车场应用程序。有一个类Vehicle,它是抽象的,并由CarTruck等具体类扩展。我有一个变量parkingFare,对于Vehicle的每个子类,它将被实例化为类变量和最终类,以便该特定类的所有实例都可以使用相同的值。例如,如果我将CarparkingFare设置为$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;
   }   
}

最新更新