2014-11-17 4 views
0

부모 클래스가 MotorVehicle이고 다른 하위 클래스가 Car, BusTruck 인 Java 프로그램을 만들려고합니다. 이제 MotorVehicle에는 6 명의 데이터 멤버가 있고 다른 클래스에는 각각 다른 데이터 멤버가 두 개 있습니다. 내 주요 방법은Java의 상속 및 arraylist

는, 나는 ArrayList<MotorVehicle> myArrayList을 생성하고 난 Car, BusTruck의 객체를 생성하고이 ArrayList에 추가합니다. 그래서 예를 들어, car을 위해 내가 할 :

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

마찬가지로 Bus에 대한, 그리고 Truck합니다. 실행하는 동안, 나는 arraylist에 새로운 인스턴스 또는 항목이 기존 항목에 대한 MotorVehicle 매개 변수를 덮어 쓰는 것을 보았습니다. 예를 들면 : 목록에 존재하는 Car 인스턴스가있는 경우. 그리고 Bus 인스턴스를 추가하면 MotorVehicle 클래스에 속하는 Bus 인스턴스의 6 개 데이터 멤버가 MotorVehicle 클래스에 속하는 기존 Car 인스턴스의 6 개 데이터 멤버를 덮어 씁니다.

는 나는이 일을 고정받을 줄 알았는데 (하지만 슬프게도, 그것은하지 않았다) :

MotorVehicle에 각각의 클래스에 또한

을 유형을 변경하는 것입니다

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

, I 다음과 같이 정의되는 생성자가 있어야합니다. 예를 들면 자동차 :

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"으로 설정하면 field1의 값은 이고 c1c2 일 것입니다. 그렇다면이 필드를 정적이 아니게 만드는 것입니다.