【问题标题】:Java: inheritance and arrays, and their childrenJava:继承和数组,以及它们的孩子
【发布时间】:2017-03-11 09:23:11
【问题描述】:

Java: 简单的问题...为什么我不能使用 array[0].childMethod?

注意 myList.method() 有效,但是当存储在数组中时,method() 变得不可用。

感谢任何帮助。

public class Main {
    public static void main(String[] args) {
        Vehicle[] array = new Vehicle[1];

        Car myList = new Car();
        System.out.println( myList.myMethod() );    //Output: 1

        array[0] = myList;
        System.out.println( array[0].myMethod() );  //Doesn't work.

    }
}
class Vehicle{

}
class Car extends Vehicle{
    public int myMethod(){
        return 1;
    }
}

【问题讨论】:

  • myMethod() 是否在 Vehicle 类中定义?
  • 命名错误;为什么你会称汽车对象为 myList?

标签: java arrays inheritance extends


【解决方案1】:

注意Vehicle 是您的父类

 Vehicle[] array = new Vehicle[1];//instance of parent

Car 是您继承的 CHILD 类

 Car myList = new Car();//instance of child

子级可以访问父级的方法和它自己的方法,反之则不行。除非您实现Dynamic Method Dispatch/Runtime Polymorphism ,否则父级无法访问子级的方法。 (这在生物学中被称为多态性——OOP 的支柱之一)

您的array 是父级实例,因此它无法访问子级的 myMethod。但是myList 是汽车的实例,所以它可以访问方法myMethod

为此,您必须声明为

 Car[] array = new Car[1];

或者你可以简单地cast 喜欢

 ((Car)array[0]).myMethod()

【讨论】:

    【解决方案2】:

    我认为,您可以简单地转换数组项:

    ((Car) array[0]).myMethod()
    

    关于“为什么?”的问题- 编译器不知道数组中是否有 Car 对象或任何其他 Vehicle 继承者。

    【讨论】:

      【解决方案3】:

      array[0] 是超类引用。

      mylist 是一个子类对象。

      你正试图从超类引用变量中调用子类的方法。它只有在子类中的方法被覆盖时才有效。

      请阅读以下概念.. 动态方法调度..

      感谢任何帮助。

        public class Main {
             public static void main(String[] args) {
             Vehicle[] array = new Vehicle[1];
      
            Car myList = new Car();
            System.out.println( myList.myMethod() );    //Output: 1
      
            array[0] = myList;
            System.out.println( array[0].myMethod() );  // output 1
            }
         }
        class Vehicle{
      
            public int myMethod(){
              return 100;
             }
        }
      
        class Car extends Vehicle{
      
          @Override
          public int myMethod(){
           return 1;
          }
        }
      

      【讨论】:

      • 不错的方法:)
      【解决方案4】:

      如果您将车辆类更改为像这样的抽象类:

      public abstract class vehicle{
      

      然后像这样在车辆中创建一个抽象方法:

      abstract int myMethod() ;
      

      那应该很好用。
      如果您想了解更多信息,YouTube 频道 thenewboston 有一些很棒的 Java 教程。
      我强烈建议您看看。他们帮了我很多。

      【讨论】:

      • 虽然其他答案是正确的,但这最终是我需要的修复,因为我的任务是创建一个 Vehicle 数组并用各种子项(卡车、汽车等)填充它。谢谢。
      • 请遵循 Java 命名约定。
      【解决方案5】:

      原因是myMethod 仅在Car 中定义。由于arrayVehicle 类型,它不知道myMethod。这就是说-我将array中的所有元素用作Vehicle,该元素可能具有其他方法或参数,但出于array的目的,我专注于Vehicle类中的方法。

      一个小的解决方法是将array[0] 转换为Car,即((Car)array[0]).myMethod()

      【讨论】:

      • 我不知道你能做到这一点,非常感谢。
      【解决方案6】:

      如果你编译代码你会得到编译时错误(不是运行时错误)。这背后的原因是:
      array[0] 的类型是 Vehicle 然后编译器认为 array[0] Vehicle 的类型和myMethod() 方法在 Vehicle 类中不存在。于是报错了。

      注意:编译不知道任何运行时信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多