【问题标题】:Cannot find symbol. Is looking in Superclass instead of subclass找不到标志。正在寻找超类而不是子类
【发布时间】:2014-01-30 01:17:01
【问题描述】:

我有一个程序为汽车经销商解释和排序数据,但在尝试检索存储在数组中的汽车颜色时出错。

这里是主类和它的子类。

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 中查找?

【问题讨论】:

    标签: java class inheritance


    【解决方案1】:

    您的数组cars 似乎是Car[] 类型。在引用数组元素后,如果引用变量为 Car,则无法判断它是引用 CarNewCar 还是 Car 的另一个子类。

    您似乎希望cars[z] 具有color 属性,因此cars 的类型可能应该是NewCar[] 而不是Car[]

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

    【讨论】:

    • 正在做“汽车汽车[] = new NewCar[80];”没有摆脱错误,'color'属性也必须在子类'NewCar'中
    • @BribeGuntails - 他说..."NewCar cars[] = new NewCar[80];"
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      public String getColor() {
         return color;
      }
      

      然后你的情况就是

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

      更新

      如果您希望 colorNewCar 中,您应该在 NewCar 中添加 public String getColor(); 方法,并且您的 cars[] 应该是 NewCar[],类似,

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

      这样你会失去继承能力,你不能再使用Car cars[] = new NewCar[arraySize]了。

      【讨论】:

      • Variable color 必须在 NewCar 类中,这是一个要求。
      • 将数组全部更改为 NewCar 会破坏 Car 类的子类 UsedCar
      • 是的,它会破坏polymorphism。除非将color 移动到超类,否则不能与Car[] 一起使用。您的 cars[] 仅包含 NewCars 或任何其他对象,例如 UsedCar
      【解决方案4】:

      如果要求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 类的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 2021-10-13
        • 2020-01-31
        相关资源
        最近更新 更多