2014-11-17 59 views
0

我想创建一个java程序,我有一个父类MotorVehicle和许多不同的子类,即Car,BusTruck。现在,MotorVehicle有6个数据成员,每个其他类每个都有2个不同的数据成员。java中的继承和arraylist

在我的主要方法,我创建了一个ArrayList<MotorVehicle> myArrayList和我创建的CarBusTruck对象并将其添加到此ArrayList。因此,例如,为car我做的:

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

同样,对于Bus,和Truck。在执行过程中,我看到新的实例或数组条目正在覆盖现有项目的MotorVehicle参数。 例如:如果我在列表中有一个存在Car实例。然后我添加一个Bus实例,属于MotorVehicle类的Bus实例的6个数据成员重写与MotorVehicle类有关的现有Car实例的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); 
} 
+0

提供必要的代码来复制您的问题。 –

+0

当您尝试从列表中访问它时,会获得您所得到的值 – jhamon

+1

另外,看起来您将这些类中的字段声明为“static”。是这样吗? –

回答

2

问题是这些字段是静态的,因为您已经评论过。 当你在一个类中有一个静态变量时,它对所有实例都有相同的值。例如,如果您有Car c1Car c2并且设置为c1.field1 = "foo",则对于c1c2两者,值field1将为"foo"。 所以,你必须做的是使这些领域不静态。