2014-11-17 2 views
0

Я пытаюсь создать программу Java, где у меня есть родительский класс MotorVehicle и много различных суб-классы, а именно Car, Bus и Truck. Теперь MotorVehicle имеет 6 членов данных, и каждый из других классов имеет по два разных члена данных.Наследование и ArrayList в Java

В моем основном методе, я создал ArrayList<MotorVehicle> myArrayList и я создаю объекты Car, Bus и Truck и добавить их к этому ArrayList. Так, например, для car я:

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

Аналогично для Bus, и Truck. Во время выполнения я увидел, что новые экземпляры или записи в arraylist переписывали параметры MotorVehicle для существующих элементов. Итак, например: Если у меня есть exisitng экземпляр в списке. И затем я добавляю экземпляр Bus, 6 членов данных экземпляра Bus, относящихся к классу MotorVehicle, перезаписывают 6 членов данных существующего экземпляра Car, относящегося к классу MotorVehicle.

Я думал, что это может исправляются, делая это (но, к сожалению, это не так):

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 c1 и Car c2 и установить c1.field1 = "foo", то значение field1 будет "foo" для обоих c1 и c2. Итак, вы должны сделать эти поля не статичными.

Смежные вопросы