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
答案 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;
编译器只知道v
是vehicle
;因此,它只能访问为vehicle
类定义的方法。如果v
实际上是car
,并且其中一个方法被car
覆盖,那么它将调用car
中的方法。但是如果你使用的方法只为car
定义了 (不是vehicle
),那么编译器就不会允许它,因为它只知道v
是vehicle
,并且它不知道它将采用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
,但它知道newCar
是car
,因为你是这样声明的。
(顺便说一句,Java约定用于类名,如car
和vehicle
,以大写字母开头。)