【问题标题】:Inheritance and arraylist in javajava中的继承和arraylist
【发布时间】:2015-01-14 14:45:46
【问题描述】:

我正在尝试创建一个 java 程序,其中我有一个父类 MotorVehicle 和许多不同的子类,即 CarBusTruck。现在,MotorVehicle 有 6 个数据成员,其他每个类都有 2 个不同的数据成员。

在我的主要方法中,我创建了一个ArrayList<MotorVehicle> myArrayList,并创建了CarBusTruck 的对象并将它们添加到这个数组列表中。例如,对于car 我愿意:

Car newCar = new Car (all, the, parameters, common, and, class, specific);
myArrayList.add(newCar);

BusTruck 也是如此。在执行期间,我看到数组列表中的新实例或条目正在覆盖现有项目的 MotorVehicle 参数。 例如:如果我在列表中有一个现有的Car 实例。然后我添加了一个Bus 实例,Bus 实例中属于MotorVehicle 类的6 个数据成员覆盖了现有Car 实例中属于MotorVehicle 类的6 个数据成员。

我认为这样做可能会解决问题(但遗憾的是,它没有):

MotorVehicle newCar = new Car (all, the, parameters, common, and, class, specific);

就是把类型改成MotorVehicle

同样在各自的类中,我有一个构造函数,定义如下:例如汽车:

public Car(all, the, parameters, common, and, class, specific){
    super(all the 6 data members of the MotorVehicle class);
    //Set the local variables - specific to Car
}

知道我哪里可能出错了吗?

CAR.java :汽车类

public class Car extends MotorVehicle{
private int numberDoors;
private String color;

public Car(){

}

public Car(int numberDoors, String color){
    setNumberDoors(numberDoors);
    setCarColor(color);
}

/*
Need to add date
*/
public Car(String vehicleType, int numberWheels, double engineSize, boolean powerSteering, String purchaseDate, int numberDoors, String color, String serialNumber){        
    super(vehicleType, numberWheels, engineSize, powerSteering, purchaseDate, serialNumber);
    setNumberDoors(numberDoors);
    setCarColor(color);
}

private void setNumberDoors(int numberDoors) {
    this.numberDoors = numberDoors;
}

public int getNumberDoors(){
    return numberDoors;
}

private void setCarColor(String color) {
    this.color = color;
}

private String getCarColor(){
    return color;
}

public String toString(){
    //Does printing
}
}

MotorVehicle.java :父类

 public  class MotorVehicle {
    static private String vehicleType;
    static private int numberWheels;
    static private double engineSize;
    static private boolean powerSteering;
    static private String purchaseDate;
        static private String serialNumber;


    //null constructor
     public MotorVehicle()
     {

     }
         //constructor with single parameter of type string
     public MotorVehicle ( String vehicleType)
     {
         setVehicleType(vehicleType);
     }
         //constructor with five parameters of type string, integer, double, boolean
     public MotorVehicle(String vehicleType, int numberWheels,double engineSize,boolean powerSteering, String
             purchaseDate, String serialNumber)
     {
         setVehicleType(vehicleType);
         setNumberWheels(numberWheels);
         setEngineSize(engineSize);
         setPowerSteering(powerSteering);
         setPurchaseDate(purchaseDate);
                 setSerialNumber(serialNumber);
     }
    public void setVehicleType (String vehicleType )
     {
         this.vehicleType=vehicleType;
     }
     static public String getVehicleType ()
     {
         return vehicleType;
     }

     public void setNumberWheels (int numberWheels)
     {
         this.numberWheels=numberWheels;
     }

     static public int getNumberWheels()
     {
         return numberWheels;
     }

     public void setEngineSize( double engineSize)
     {
         this.engineSize=engineSize;
     }

     static public double getEngineSize( )
     {
         return engineSize;

     }
     public void setPowerSteering (boolean powerSteering)
     {
         this.powerSteering=powerSteering;
     }

     static public boolean getPowerSteering()
     {
         return powerSteering;
     }

     public void setPurchaseDate (String purchaseDate )
     {
         this.purchaseDate=purchaseDate;
     }

     static public String getPurchaseDate ()
     {
         return purchaseDate; 

     }

         public void setSerialNumber (String serialNumber)
     {
         this.serialNumber=serialNumber;
     }

     static public String getSerialNumber()
     {
return serialNumber;
     }

        @Override
        public String toString() {
//Does printing
    }
    }

添加函数 :在主类中

add(ArrayList<MotorVehicle> myArrayList)
{
    System.out.print("Enter vehicle type- CAR, BUS, TRUCK, OTHER: ");
    type = sc.next();
    if (type.equalsIgnoreCase("Car")) {
        int wheels = 0, doors = 0;
        String date = "", color = "", serialNo = "";
        boolean powerSteering = false;
        double eSize = 0.0;

        System.out.print("Enter the number of wheels: ");
        wheels = sc.nextInt();

        System.out.print("Enter the enginer size in cc: ");
        eSize = sc.nextDouble();

        System.out.print("Enter true for power steering else false: ");
        powerSteering = sc.nextBoolean();

        System.out.print("Enter the purchase date as mm/dd/yyyy: ");
        date = sc.next();

        System.out.print("Enter the vehicle serial number: ");
        serialNo = sc.next();

        System.out.print("Enter the number of doors: ");
        doors = sc.nextInt();

        System.out.print("Enter the car's color: ");
        color = sc.next();

        MotorVehicle newCar = new Car("Car", wheels, eSize, powerSteering, date, doors, color, serialNo);
        myArrayList.add(newCar);
}

【问题讨论】:

  • 提供必要的代码来复制您的问题。
  • 当你尝试从你的列表中访问它时,投射你得到的值
  • 另外,看起来您将这些类中的字段声明为static。是这样吗?
  • 我已经给你发了电子邮件,@LuiggiMendoza
  • 再说一次,请不要通过电子邮件向我发送您的代码。相反,在问题中提供必要的代码来复制问题。

标签: java class inheritance arraylist super


【解决方案1】:

问题在于字段是静态的,正如您所评论的那样。 当您在一个类中有一个静态变量时,它对于所有实例都具有相同的值。例如,如果您有Car c1Car c2 并设置c1.field1 = "foo",则field1 的值对于c1c2 都将是"foo"。 所以,你必须做的是使这些字段非静态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2011-07-22
    • 2021-12-25
    • 2015-12-25
    相关资源
    最近更新 更多