无法访问java数组中的对象
上面的代码在我的主方法中。注释掉的行抛出类vehicle中找不到符号的错误。我正在从文件中读取信息并将其放入正确的对象数据字段中。该阵列是一个车辆阵列。据我所知,车辆数组中的一个元素可以是车辆或车辆的任何子类。使用父类的getter和setter,子类中的每个类都可以使用getter和setter方法。汽车是汽车的一个子类。当我刚刚创建了car对象时,为什么不先尝试访问cars方法,然后再尝试vehicle呢?问题出在我的车上了吗?car是静态的,因为它是一个嵌套类,如果您不使其保持静态,它将抛出一个错误。 下面是汽车等级的总结无法访问java数组中的对象,java,arrays,methods,polymorphism,overriding,Java,Arrays,Methods,Polymorphism,Overriding,上面的代码在我的主方法中。注释掉的行抛出类vehicle中找不到符号的错误。我正在从文件中读取信息并将其放入正确的对象数据字段中。该阵列是一个车辆阵列。据我所知,车辆数组中的一个元素可以是车辆或车辆的任何子类。使用父类的getter和setter,子类中的每个类都可以使用getter和setter方法。汽车是汽车的一个子类。当我刚刚创建了car对象时,为什么不先尝试访问cars方法,然后再尝试vehicle呢?问题出在我的车上了吗?car是静态的,因为它是一个嵌套类,如果您不使其保持静态,它将抛
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());
}
System.out.println打印出该字符串的正确值,因此我感兴趣的是,为什么对象希望尝试将类vehicle用于其方法,而不是类car和类vehicle。这是一辆车,如果有帮助的话
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
如果我理解了这个问题,您会问为什么下面这行没有编译:
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
vehicleLot定义为车辆的数组。它可以包含任何车辆子类的实例。因此,vehicleLot[i]不一定有getColor方法,因为这是一种Car方法
为了访问Car的方法,您必须将车辆引用转换为Car:
System.out.println(vehicleLot[i].getColor());
当然,这只有在vehicleLot[i]引用汽车实例时才起作用。如果没有,将抛出一个ClassCastException。如果我理解了这个问题,您会问为什么下面这行没有编译:
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
vehicleLot定义为车辆的数组。它可以包含任何车辆子类的实例。因此,vehicleLot[i]不一定有getColor方法,因为这是一种Car方法
为了访问Car的方法,您必须将车辆引用转换为Car:
System.out.println(vehicleLot[i].getColor());
当然,这只有在vehicleLot[i]引用汽车实例时才起作用。如果没有,将抛出ClassCastException。似乎您遗漏了有关多态性的一个复杂细节,您可以根据多态性将一个Car对象放入车辆阵列中 在调用arrayElements上的方法时,如果已重载,则会调用正确的重载方法,即, 但既然没有 getColor;在您的车辆级别中,它不起作用, 假设您在Vehicle类中编写了一个getColor,并在Car类中重载了它 那你说呢
System.out.println(((Car)vehicleLot[i]).getColor());
车坏了
将调用getColor,
但是,请注意,编译器首先检查vehicle类是否具有该方法,然后才检查实际的对象类型并调用属于car类的重载方法,
但是在您的情况下,第一个测试失败,并抛出一个错误
尝试阅读Java中的多态性和运行时绑定似乎您遗漏了一个关于多态性的复杂细节,您可以将一个Car对象放入一个Vehicle数组中 在调用arrayElements上的方法时,如果已重载,则会调用正确的重载方法,即, 但既然没有 getColor;在您的车辆级别中,它不起作用, 假设您在Vehicle类中编写了一个getColor,并在Car类中重载了它 那你说呢
System.out.println(((Car)vehicleLot[i]).getColor());
车坏了
将调用getColor,
但是,请注意,编译器首先检查vehicle类是否具有该方法,然后才检查实际的对象类型并调用属于car类的重载方法,
但是在您的情况下,第一个测试失败,并抛出一个错误
尝试阅读Java中的多态性和运行时绑定,Car是vehicle的一个子类。当我刚刚创建了car对象时,为什么不先尝试访问cars方法,然后再尝试vehicle呢 这实际上只适用于多态方法,这些方法是为超类定义的,然后可能在子类中重写。如果你说
Vehicle v=new Car();
v.getColor();
编译器只知道v是一个载体;因此,它只能访问为vehicle类定义的方法。如果v实际上是一个car,并且其中一个方法被car重写,那么它将调用car中的方法。但是如果你使用一个只为car而不是为vehicle定义的方法,编译器将不允许它,因为它只知道v是一个vehicle,而不知道它将有一个car方法,比如getColor。即使您刚刚为新车指定了v,这也是正确的。编译器只查看声明车辆v;它不会试图通过倒转程序来找出分配给它的内容
你可以用cast来解决这个问题,就像Eran的回答一样,但在这种特殊情况下,你不需要这样做。改变
vehicle v;
到
编译器可能认为vehicleLot[i]可以是任何车辆,但它知道newCar是一辆车,因为您是这样声明的
由佤邦
y、 Java约定的类名,如car和vehicle,以大写字母开头。car是vehicle的一个子类。当我刚刚创建了car对象时,为什么不先尝试访问cars方法,然后再尝试vehicle呢 这实际上只适用于多态方法,这些方法是为超类定义的,然后可能在子类中重写。如果你说
Vehicle v=new Car();
v.getColor();
编译器只知道v是一个载体;因此,它只能访问为vehicle类定义的方法。如果v实际上是一个car,并且其中一个方法被car重写,那么它将调用car中的方法。但是如果你使用一个只为car而不是为vehicle定义的方法,编译器将不允许它,因为它只知道v是一个vehicle,而不知道它将有一个car方法,比如getColor。即使您刚刚为新车指定了v,这也是正确的。编译器只查看声明车辆v;它不会试图通过倒转程序来找出分配给它的内容
你可以用cast来解决这个问题,就像Eran的回答一样,但在这种特殊情况下,你不需要这样做。改变
vehicle v;
到
编译器可能认为vehicleLot[i]可以是任何车辆,但它知道newCar是一辆车,因为您是这样声明的
顺便说一下,Java约定是用于类名的,比如car和vehicle,以大写字母开头。在哪里设置控件的值您不需要control.equalsCar==true,因为control.equalsCar已经返回布尔值您在哪里设置控件的值您不需要control.equalsCar==true,因为control.equalsCar已经返回一个布尔值问题,这个问题是可能很容易,但如果我有一辆以上的车会发生什么?我只需要在数组中的适当位置放置一堆新车,但如果我需要对它们进行排序怎么办。如果我所有的汽车对象都被命名为newCar,这会导致任何问题吗?我喜欢通过声明vehicleLot[I]=新车主、地址、电话、电子邮件、敞篷车、颜色来确保编译器知道我的车是一辆车的解决方案;。在您更新的代码中,它显式地将一辆车分配给该元素,这很有意义,但我的代码当时做了什么?我现在需要阅读更多内容。我只是更好奇,为什么当我创建我的对象并将其引用分配给数组中的元素时,它不知道它是一辆车。关于这一点的问题可能很简单,但如果我有多辆车会发生什么?我只需要在数组中的适当位置放置一堆新车,但如果我需要对它们进行排序怎么办。如果我所有的汽车对象都被命名为newCar,这会导致任何问题吗?我喜欢通过声明vehicleLot[I]=新车主、地址、电话、电子邮件、敞篷车、颜色来确保编译器知道我的车是一辆车的解决方案;。在您更新的代码中,它显式地将一辆车分配给该元素,这很有意义,但我的代码当时做了什么?我现在需要阅读更多内容。我只是更好奇,为什么当我创建我的对象并将其引用分配给数组中的元素时,它不知道它是一辆车。关于编译时错误的解释非常好。我们只是在学习动态绑定和多态性,所以我还处于研究和学习的初级阶段。@Stevenfowler16很高兴它有帮助!现在是学习好的命名惯例和设计实践的时候了。是的,命名是一个错误,我把它大写了,但后来我觉得它很有趣,所以我又改成小写。当我做完后,我会把它全部评论出来。你在程序中做了自己的吗?@Stevenfowler16你说的全部注释是什么意思?关于编译时错误的解释非常好。我们只是在学习动态绑定和多态性,所以我还处于研究和学习的初级阶段。@Stevenfowler16很高兴它有帮助!现在是学习好的命名惯例和设计实践的时候了。是的,命名是一个错误,我把它大写了,但后来我觉得它很有趣,所以我又改成小写。当我做完后,我会把它全部评论出来。你在节目中做了自己的事吗?@Stevenfowler16你说的全部评论是什么意思?