子类编辑声明抽象类类成员

Subclass editing declared abstract classes classmember

我有一个抽象 class 子 class 将继承。我想要一个 get 方法来 return 乘客数量。我在摘要 class 中声明了这个方法,它将 return 乘客。

class成员passengers没有定义而是实例化,所以get方法知道return.

什么变量

在子classes中,我希望这个变量有不同的值。

但是,get方法returns 0即使乘客数量不为0。

我试过写:passengers = random.nextInt(4) + 1;

摘要class车辆

import java.util.Random;

public abstract class Vehicle {
    protected Random random = new Random();
    protected int passengers;

    public int getPassengerAmount() {
        return this.passengers;
    }
}

Class汽车

public class Car extends Vehicle {
    private String name = "Car";
    private int size = 1;
    public int passengers = random.nextInt(4) + 1;
}

您通过在 Car class 中重新声明 passengers 变量来屏蔽父变量。

您应该改为在子项的构造函数中初始化父变量:

public class Car extends Vehicle {

    private String name = "Car";
    private int size = 1;

    public Car() {
        this.passengers = random.nextInt(4) + 1;
    }

}

如果你想让它成为public,那么你应该在Vehicleclass中把它变成public,但老实说我不推荐它我宁愿使用受保护的变量,但 public getters / setters.

您没有使用好的方法来计算特定车辆中有多少乘客。

很高兴将您的 Vehicle 作为一个抽象 class,因为它只有所有 Vehicle 共享的共同特征,并让每个特征在各自的实现中实现classes.

Car。您必须实施 Car 中应该有多少乘客的具体概念。因此,getPassengerAmount() 应在您的 Vehicle 中声明 abstract 并在每个特定车辆中实施。

这意味着:

import java.util.Random;

public abstract class Vehicle {
protected Random random = new Random();
protected int passengers;

public Vehicle() {
   initializeVehiculeOptions();  
}

public abstract int initializeVehiculeOptions();    
}

import java.util.Random;

public class Car extends Vehicle {

     private String name = "Car";
     private int size = 1;

     public Car() {
          super();
     }

     @Override
     public int initializeVehiculeOptions() {
          // Here you initialize for 
          this.passengers = random.nextInt(4) + 1;
     }
}

您将使用一个 Car 实例

Car ford = new Car();

您的问题的答案是您正在直接初始化 passengers 变量。你必须为它创建一个构造函数并在那里分配一个默认值。另外,您无需在 subclass 中再次创建 public 变量,否则抽象 class 就没有存在意义。 注意,一个抽象class必须有一个抽象函数。

public class Car extends Vehicle {
    private String name = "Car";
    private int size = 1;
    public int passengers = random.nextInt(4) + 1; // this is not passengers of the superclass
    void setPassengers() { passengers = random.nextInt(4) + 1; } // this is passengers of the superclass
}