爪哇: 简单的问题......为什么我不能使用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;
}
}
答案 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 中不存在。所以错误出现了。
注意:编译不知道任何运行时信息。