Java继承 - 从父类获取参数

时间:2012-11-08 04:54:49

标签: java

我正在尝试从Car的父类中获取一个参数并将其添加到我的数组(carsParked),我该怎么做?

父类

public class Car
{
    protected String regNo;       //Car registration number
    protected String owner;       //Name of the owner
    protected String carColor;

    /** Creates a Car object
     * @param rNo - registration number
     * @param own - name of the owner
     **/
    public Car (String rNo, String own, String carColour)
    {
        regNo = rNo;
        owner = own;
        carColor = carColour;
    }

    /** @return The car registration number
     **/
    public String getRegNo()
    {
        return regNo;
    }

    /** @return A String representation of the car details
     **/
    public String getAsString()
    {
        return "Car: " + regNo  + "\nColor: " + carColor;

    }
    public String getColor()
    {
        return carColor;
    }
}

儿童班

public class Carpark extends Car
{
    private String location;        // Location of the Car Park  
    private int capacity;           // Capacity of the Car Park - how many cars it can hold 
    private int carsIn;             // Number of cars currently in the Car Park   
    private String[] carsParked;

    /** Constructor for Carparks
     * @param loc - the Location of the Carpark
     * @param cap - the Capacity of the Carpark
     */
    public Carpark (String locations, int room)
    {

        location = locations;
        capacity = room;
    }
    /** Records entry of a car into the car park */
    public void driveIn()
    {
         carsIn = carsIn + 1;



    }

    /** Records the departure of a car from the car park */
    public void driveOut()
    {
        carsIn = carsIn - 1;
    }

    /** Returns a String representation of information about the carpark */
    public String getAsString()
    {
        return location + "\nCapacity: " + capacity +
             "  Currently parked:  " + carsIn + 
             "\n*************************\n";
    }

}

最后问题方法

  

public String getCarsByColor(String carColour)

     

{

  for (int num = 0; num < carsParked.length; num++)
    {
        if ( carColour.equals(carsParked[num]) )
        {
            System.out.print (carsParked[num]);
        }
    }
return carColour;

}

到目前为止我已经这样了,如果在参数中放入“红色”,它会列出所有颜色为红色的汽车及其相应的信息,但似乎不起作用~_~。

2 个答案:

答案 0 :(得分:7)

你似乎在这里有错误的关系:停车场不是汽车。我建议不要在这些类之间的任何一个方向上使用继承。 Carpark应该只有一个阵列或汽车集合。

另请注意,参数carsIn不是必需的 - 只需获取汽车数组的length(或size(),如果它是Collection)。

编辑好的,忽略继承部分,似乎在调用driveIn时添加汽车是有意义的,并在调用driveOut时将其删除。< / p>

driveIn可能应该以{{1​​}}作为参数,因此该方法可以访问您要存储的参数(我个人只会存储Car引用,但很好)。由于我们将添加和删除这些参数,因此使用可以调整自身而不是数组的Car会更容易,例如ArrayList。例如:

List

private final List<String> carsRegNosParked = new ArrayList<String>(); public void driveIn(Car car) { carsRegNosParked.add(car.getRegNo()); } 应该做什么不太清楚。可能需要删除特定的注册号:

driveOut

或者它可能只是不分青红皂白地移走一辆车,比如说第一辆车加了:

public void driveOut(String regNo) {
    carsRegNosParked.remove(regNo);
}

请注意remove(Object)remove(int)之间的区别。

答案 1 :(得分:0)

首先将carsParked更改为列表。所以:

private String[] carsParked;

变为

private List<String> carsParked;

然后在构造函数中通过执行以下操作将其初始化为空列表:     carsParked = new ArrayList();

然后在你的驾驶方法中,让它采取汽车参数并拉出你想要的参数:

public void driveIn(Car car) {
   carsParked.add(car.getRegNo());
}

此外,您无需以这种方式跟踪汽车数量。因为你总是可以carsParked.size()找出答案。

<小时/> 现在我可能会将该列表更改为List<Car>而不是字符串,然后将整个汽车转储到那里。当然,你现在可能只需要一件物品,但是谁知道在路上,也许你还需要别的东西。

修改 当然你可以用一个简单的数组来做到这一点。问题在于尺寸。假设您最初创建一个大小为5的数组,当您添加6项时,您需要创建一个新的更大的数组,复制原始数据,然后添加新项目。更多的工作。现在,如果您有一个停车场,并且它可以有X个点,那么您可以从头开始将阵列初始化为该大小。

public Carpark (String locations, int room){
    location = locations;
    capacity = room;
    //this creates an array with the max number of spots
    carsParked = new String[capacity];
    //also good idea to init 
    carsIn = 0; //initial number of cars parked
}

然后在您的driveIn()方法中:

public void driveIn(Car car) {
   carsParked[carsIn] =car.getRegNo();
   carsIn=carsIn+1;
}

现在driveOut()

public void driveOut(Car car) {
   //loop through the array until we find the car
   for (int i=0; i < carsParked.length; i=i+1){
     if (car.getRegNo().equals(carsParked[i])){
        //we found the car, so set the space null
        carsParked[i] = null;
        carsIn=carsIn-1;
        //stop looping now
        break;
     }
   }
}

看起来不错不是吗。好吧不,不是。现在driveIn将不起作用,因为我们在整个地方都散布着零点。我们如何解决它:

public void driveIn(Car car) {
   //loop through the array until we find a null spot, 
   //then park the car
   for (int i=0; i < carsParked.length; i=i+1){
     if (carsParked[i] == null){
        //we found the car, so set the space null
        carsParked[i] = car.getRegNo();
        carsIn=carsIn+1;
        //stop looping now
        break;
     }
   }
}

它还可以进一步改进。我可能仍会将String[] carsParked更改为Car[] carsParked,以免丢弃信息。 我还会更改driveIndriveOut方法以返回布尔值,以指示是否已成功停放或未停放汽车。

最终编辑: 好的,如果您想跟踪停放在停车场的汽车以及它们所在的位置,您需要了解每辆汽车的独特信息。在您的情况下,您可能只需要regNo。因此,当您致电driveIndriveOut时,您必须传递该信息,以便我们将其存储在数组中的相应索引(停车位)。否则所有你会知道的是一辆车停在某处,或者车停了。不是哪个斑点是开放的。

因此,简而言之,这两种方法中的参数Car car包含唯一标识正在停放或正在离开的每辆车所需的信息。如果没有它,停车场实例将不知道当前停放的人或他们停放的地方。