Java:继承和数组,以及它们的子代

时间:2017-03-11 09:23:11

标签: java arrays inheritance extends

爪哇: 简单的问题......为什么我不能使用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;
    }
}

6 个答案:

答案 0 :(得分:4)

注意Vehicle是您的父母类

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

Car是你继承的CHILD类<​​/ p>

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

Child可以访问Parent的方法和自己的方法,但反之亦然。除非您实施Dynamic Method Dispatch/Runtime Polymorphism ,否则父无法访问子方法。 (这被称为生物学中的多态性 - OOP支柱之一)

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

为此你必须声明为

 Car[] array = new Car[1];

或者你可以简单cast喜欢

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

答案 1 :(得分:2)

array [0]是超类引用。

mylist是一个子类对象。

您正在尝试从超类引用变量调用子类的方法..它仅在子类中的方法被重写时才有效。

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

感谢任何帮助。

  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;
    }
  }

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

原因是myMethod仅在Car中定义。由于array的类型为Vehicle,因此它不了解myMethod。这就是说 - 我使用array中的所有元素作为Vehicle,该元素可能有其他方法或参数,但出于array的目的,我专注于Vehicle中的方法{1}}上课。

一个小小的解决方法是将array[0]投射到Car,即((Car)array[0]).myMethod()

答案 4 :(得分:1)

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

public abstract class vehicle{

然后在车辆中制作一个抽象方法:

abstract int myMethod() ;

那应该很好用。
如果你想了解更多,YouTube频道thenewboston有一些惊人的java教程。
我强烈推荐一看。他们帮了我很多。

答案 5 :(得分:0)

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

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