无法访问数组java中的对象

时间:2014-10-23 16:52:58

标签: java arrays methods polymorphism override

else if (control.equals("Car") == true)
{
     owner = (scanner.nextLine());                     
     address = (scanner.nextLine());
     phone = (scanner.nextLine());
     email =(scanner.nextLine());
     convertible= (scanner.nextBoolean());
     color = (scanner.nextLine());

     vehicleLot[i] = new car(owner, address, phone, email, convertible, color);
     System.out.println(vehicleLot[i].getOwner());
     System.out.println(vehicleLot[i].getAddress());
     //System.out.println(vehicleLot[i].getColor());
}

以上代码是我的主要方法。被注释掉的行抛出错误"在类车辆中找不到符号"。我正在从文件中读取并将信息放入正确的对象数据字段中。该阵列是一系列车辆。根据我的理解,车辆阵列的一个元素可以是车辆或任何车辆的子类。 getters和setters方法可用于每个相应的类,子类使用父类的getter和setter。汽车是汽车的子类。为什么在我刚刚创建汽车对象时尝试先尝试使用汽车方法?问题出在我的汽车构造函数中吗? car是静态的,因为它是一个嵌套类,如果你不保持静态就会抛出错误。 以下是汽车类的摘要。

static class Car extends vehicle
{
  private boolean convertible;
  private String color;
  public Car()
  {

  }
  public Car(String ownersName, String address, String phone, String email, boolean convertible, String color)
  {
      super.setOwner(ownersName) ;
      super.setAddress(address);
      super.setPhone(phone);
      super.setEmail(email);
      this.convertible = convertible;
      this.color = color;
      System.out.println(this.convertible);
  }//Car class ends

System.out.println打印出该字符串的正确值,因此我对该对象想要尝试的原因感兴趣,并且只使用类车辆而不是类车和类车。如果这有帮助,这是车辆。

public static class Vehicle
{
    private String ownersName;
    private String address; 
    private String phone;
    private String email;

    public Vehicle()
    {
    }
    public Vehicle(String ownersName, String address, String phone, String email)
    {
        this.ownersName = ownersName;
        this.address = address;
        this.phone = phone;
        this.email = email;
     }
}//Vehicle class ends

3 个答案:

答案 0 :(得分:2)

如果我理解了这个问题,你就会问为什么以下行不能编译:

System.out.println(vehicleLot[i].getColor());

vehicleLot被定义为Vehicle的数组。它可以包含Vehicle的任何子类的实例。因此,vehicleLot[i]不一定有getColor()方法,因为这是Car的方法。

为了访问Car的方法,您必须将Vehicle引用转换为Car:

System.out.println(((Car)vehicleLot[i]).getColor());

当然,这仅在vehicleLot[i]引用Car实例时才有效。如果没有,则会抛出ClassCastException

答案 1 :(得分:1)

似乎你错过了关于多态性的错综复杂的细节,你可以将Car Object放入Vehicle数组(由于多态性)  并且在调用arrayElements上的方法时,会调用正确的重载方法(如果你已经重载了它,即是), 但既然没有 getColor();在你的车辆类中,它不起作用, 假设您在getColor()类中编写了Vehicle并在Car类中重载了它,

然后你说了

Vehicle v=new Car(); 
v.getColor();

汽车 getColor()将被调用, 但是,请注意编译器首先检查车辆类是否具有方法,然后它检查实际的对象类型并调用属于汽车类的重载方法, 但在您的情况下,第一次测试失败并抛出错误 尝试阅读关于P olymorphism和Java中的运行时绑定

答案 2 :(得分:1)

"汽车是汽车的子类。当我刚刚创建汽车对象时,为什么不尝试先尝试使用汽车方法?"

这实际上仅适用于多态方法,这些方法是为超类定义的,然后(可能)在子类中重写。如果你说

vehicle v;

编译器只知道vvehicle;因此,它只能访问为vehicle类定义的方法。如果v实际上是car,并且其中一个方法被car覆盖,那么它将调用car中的方法。但是如果你使用的方法只为car定义了 (不是vehicle),那么编译器就不会允许它,因为它只知道vvehicle,并且它不知道它将采用car方法,例如getColor。即使您刚刚将v分配给new car,也是如此。编译器只查看声明vehicle v;它不会试图通过你的程序向后找出你分配给它的东西。

你可以用演员来解决问题,就像伊兰的回答一样,但在这种特殊情况下你不需要。变化

 vehicleLot[i] = new car(owner, address, phone, email, convertible, color);
 System.out.println(vehicleLot[i].getOwner());
 System.out.println(vehicleLot[i].getAddress());
 System.out.println(vehicleLot[i].getColor());

 car newCar = new car(owner, address, phone, email, convertible, color);
 vehicleLot[i] = newCar;
 System.out.println(newCar.getOwner());
 System.out.println(newCar.getAddress());
 System.out.println(newCar.getColor());

编译器可能认为vehicleLot[i]可以是任何vehicle,但它知道newCarcar,因为你是这样声明的。

(顺便说一句,Java约定用于类名,如carvehicle,以大写字母开头。)