在Array vs ArrayList中转换对象并在对象上调用方法

时间:2013-10-18 20:55:53

标签: java arraylist casting static polymorphism

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

car[] cArray = new car[20];

让我们说我有一个扩展汽车级的丰田级。汽车类有一种在丰田级别中被覆盖的打印方法。

我知道如果我创建丰田对象然后将它们放在cArray中它们将成为Car对象,如果我想在它们上调用print(Toyota t)函数,我需要在print()方法中强制转换对象像这样打电话:(这会是向上转播还是向下倾斜?)

假设cArray在前10个指数中有丰田对象

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)是否是正确的解决方法,我已阅读教科书和javadoc等,但我还没有看到一个object.method(exactSameObject)之前使用过。在我的Main中,我需要调用它,我使用Car.print(toy)但是编译器声明这不能从静态上下文引用。显然,我不了解一些基本概念,请帮忙!

3 个答案:

答案 0 :(得分:2)

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

事实上,这会称之为丰田的印刷方法,但是,这真的是你想要的吗?

如果你覆盖丰田的toString()方法,你可以这样做:

System.out.println( toy );

重写的方法看起来像这样:

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

现在不需要施法。

答案 1 :(得分:1)

首先,一旦它是Toyota对象,它就已经是Car个对象了。仅仅因为Car引用并不意味着Toyota不再是Toyota。无需转换为Toyota来调用Toyota的{​​{1}}方法,因为您已经说print的{​​{1}}方法覆盖了Toyota。 Java中的多态性确保如果你有一个超类(print)引用子类(Car)来覆盖一个方法,那么就会调用子类方法,而不是超类方法。这应该可以正常工作:

Car

或数组版本:

Toyota

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

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

此外,如果Car car = cArray[0]; car.print(car); 方法为car.print(); ,则Car.print(car);是您输入的内容。该方法不是print,因为你已经说它被覆盖了(静态方法没有被覆盖)。

答案 2 :(得分:1)

如果丰田是汽车的子类,那么你真的不需要做所有这些。

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

应输出

我是一辆车

我是丰田汽车

这两个对象都是汽车。