Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法访问java数组中的对象_Java_Arrays_Methods_Polymorphism_Overriding - Fatal编程技术网

无法访问java数组中的对象

无法访问java数组中的对象,java,arrays,methods,polymorphism,overriding,Java,Arrays,Methods,Polymorphism,Overriding,上面的代码在我的主方法中。注释掉的行抛出类vehicle中找不到符号的错误。我正在从文件中读取信息并将其放入正确的对象数据字段中。该阵列是一个车辆阵列。据我所知,车辆数组中的一个元素可以是车辆或车辆的任何子类。使用父类的getter和setter,子类中的每个类都可以使用getter和setter方法。汽车是汽车的一个子类。当我刚刚创建了car对象时,为什么不先尝试访问cars方法,然后再尝试vehicle呢?问题出在我的车上了吗?car是静态的,因为它是一个嵌套类,如果您不使其保持静态,它将抛

上面的代码在我的主方法中。注释掉的行抛出类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你说的全部评论是什么意思?