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)
但是编译器声明这不能从静态上下文引用。显然,我不了解一些基本概念,请帮忙!
答案 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();
}
应输出
我是一辆车
我是丰田汽车
这两个对象都是汽车。