找不到标志。正在寻找超类而不是子类

时间:2014-01-30 01:17:01

标签: java class inheritance

我有一个程序可以解释和排序汽车经销商的数据,并且在尝试检索存储在阵列中的汽车的颜色时出错。

这是主类及其子类。

class Car
{
protected String model;
protected int price;
protected int year;

public Car(String m, int y,  int p)
{
    model = m;
    price = p;
    year = y;
}
}


class NewCar extends Car
{
protected String color;

public NewCar(String m, int y, int p, String c)
{
    super(m, y, p);
    color = c;
}

public String toString()
{
    return "Model: " + model + "\n"
    + "Year: " + year + "\n"
    + "Price: $" + price + "\n"
    + "Color: " + color + "\n"
    + "Selling Price: " + price + "\n\n";
}
}

这是另一个发生错误的类,位于if(cars[z].color.equals(shade))。 该程序在Car类中找不到变量颜色。

  class CarDealerShip
    {

        public String printAllCarsOfColor(String shade)
    {
        String s = "";

        for(int z = 0; z < i; z++)
        {
            if(cars[z].color.equals(shade))
            {
                s += "Car " + (z + 1) + "\n" + cars[z].toString();
            }
        }
        return s;
    }

如何让程序看起来在NewCar类中存在变量颜色?

4 个答案:

答案 0 :(得分:3)

您的数组cars似乎是Car[]类型。在引用数组元素后引用变量Car,无法判断它是否引用CarNewCarCar的另一个子类}。

您希望cars[z]拥有属性color,因此cars可能属于NewCar[]类型,而不是Car[]

另一种选择是将属性color移至超类Car,以便任何Car都可以有颜色。

答案 1 :(得分:1)

使用受保护的访问时,该字段将在同一个包中的类中或在基类的子类中可用。我假设访问CarDealerShip字段的类color不在同一个包中,或者不扩展Car

答案 2 :(得分:1)

colorNewCar保护。您只能在子类中访问受保护的变量。您需要将color移至Car并在public String getColor()中添加Car方法,以使其可用于不属于Car继承的类层次结构。

public String getColor() {
   return color;
}

然后你的病情就是

if(cars[z].getColor().equals(shade))

<强>更新

如果您希望color位于NewCar,则应在public String getColor();中添加NewCar方法,cars[]应为NewCar[] ,等等,

NewCar cars[] = new NewCar[arraySize]();

这样你将失去继承功能,你不能再使用Car cars[] = new NewCar[arraySize]

答案 3 :(得分:0)

如果要求color必须在课程NewCar中,您可以使用instanceof运算符然后投射它:

class CarDealerShip
{
    public String printAllCarsOfColor(String shade)
    {
        String s = "";

        for(int z = 0; z < i; z++)
        {
            if (cars[z] instanceof NewCar)
            {
                NewCar nc = (NewCar)cars[z];
                if (nc.color.equals(shade))
                {
                    s += "Car " + (z + 1) + "\n" + nc.toString();
                }
            }
        }
        return s;
    }
}

实际上,您跳过每个Car而不是NewCar,并且只使用属于该类NewCar的实例。