0
java.util.ArrayList<car> cList = new java.util.ArrayList<Car>();

car[] cArray = new car[20];

假设我有一个扩展汽车类的丰田类。Car 类有一个在 Toyota 类中被覆盖的 print 方法。

我知道如果我创建 Toyota 对象然后将它们放在 cArray 中,它们将成为 Car 对象,如果我想print(Toyota t)在它们上调用函数,我需要在 print() 方法调用中转换对象,如下所示:(这会是向上还是向下?)

假设 cArray 在前 10 个索引中有 Toyota 对象

Toyota toy = (Toyota)cArray[0];
toy.print(toy); //this should call the Toyota's print method

如果我要使用 ArrayList,这可能吗?

Toyota toy = (Toyota)cList.get(0);
toy.print(toy); //does this call Toyota's print method or car's print method?

最后一点:我不确定这是否toy.print(toy)是正确的方法,我已经阅读了教科书和 javadocs 等,但我之前没有见过 object.method(exactSameObject) 使用过。在我需要调用它的 Main 中,我使用Car.print(toy)但是编译器声明它不能从静态上下文中引用。显然我不理解一些基本概念,请帮助!

4

3 回答 3

2
Toyota toy = (Toyota)cArray[0];
toy.print(toy); //this should call the Toyota's print method

确实,这会调用丰田的打印方法,但是,这真的是您想要的吗?

如果你重写 Toyota 中的 toString() 方法,你可以这样做:

System.out.println( toy );

被覆盖的方法看起来像这样:

public String toString() {
    return "I'm a Toyota!";
}

现在不需要铸造了。

于 2013-10-18T21:03:22.540 回答
1

首先,一旦它是一个Toyota对象,它就已经是一个Car对象。仅仅因为有Car引用并不意味着不再Toyota是 a Toyota。没有必要强制转换Toyota为调用Toyotaprint方法,因为您已经说过Toyota' 的print方法会覆盖Car. Java 中的多态性确保如果您有一个超类 ( Car) 引用了一个Toyota覆盖方法的子类 ( ),则调用的是子类方法,而不是超类方法。这应该可以正常工作:

Car car = cList.get(0);
car.print(car);

或数组版本:

Car car = cArray[0];
car.print(car);

此外,将方法中的实例传递给自身可能不是必需的。您应该能够从方法中删除该参数(在两个类中),然后调用:

car.print();

此外,Car.print(car);如果print方法是static. 该方法不是static,因为您已经说过它已被覆盖(静态方法未被覆盖)。

于 2013-10-18T21:00:31.747 回答
1

如果 Toyota 是 Car 的子类,那么您实际上不需要做所有这些。

public class Car {
   public void print() {
       System.out.println("I am a car");
   }
}

public class Toyota extends Car {
   public void print() {
       System.out.println("I am a Toyota car");
   }
}

public static void main(String args[]) {
   car[] cArray = new car[20];
   car[0] = new Car();
   car[1] = new Toyota();

   car[0].print();
   car[1].print();
}

应该输出

我是一辆车

我是丰田车

两个对象都是汽车。

于 2013-10-18T21:00:56.770 回答