Java 在数组vs ArrayList中强制转换对象并对该对象调用方法
如果我使用ArrayList,这可能吗Java 在数组vs ArrayList中强制转换对象并对该对象调用方法,java,arraylist,casting,static,polymorphism,Java,Arraylist,Casting,Static,Polymorphism,如果我使用ArrayList,这可能吗 Toyota toy = (Toyota)cArray[0]; toy.print(toy); //this should call the Toyota's print method 最后一点注意:我不确定toy.print(toy)是否是正确的方法,我已经阅读了教科书和javadocs等,但我还没有看到以前使用过的object.method(exactSameObject)。在我主要需要调用它的地方,我使用了Car.print(toy),但是编译器声
Toyota toy = (Toyota)cArray[0];
toy.print(toy); //this should call the Toyota's print method
最后一点注意:我不确定
toy.print(toy)
是否是正确的方法,我已经阅读了教科书和javadocs等,但我还没有看到以前使用过的object.method(exactSameObject)。在我主要需要调用它的地方,我使用了Car.print(toy)
,但是编译器声明这不能从静态上下文引用。很明显,我不理解一些基本概念,请帮助 首先,一旦它是丰田
对象,它就已经是汽车
对象了。仅仅因为有一辆汽车
参考并不意味着丰田
不再是丰田
。没有必要使用Toyota
调用Toyota
的print
方法,因为您已经说过Toyota
的print
方法会覆盖汽车的方法。Java中的多态性确保,如果对重写方法的子类(Toyota
)有一个超类(Car
)引用,则调用子类方法,而不是超类方法。这应该很好:
Toyota toy = (Toyota)cList.get(0);
toy.print(toy); //does this call Toyota's print method or car's print method?
或阵列版本:
Car car = cList.get(0);
car.print(car);
另外,在方法中将实例传递给自身可能是不必要的。您应该能够从方法中删除该参数(在这两个类中),只需调用:
Car car = cArray[0];
car.print(car);
另外,Car.print(Car)如果print
方法是static
,则会键入code>。该方法不是静态的,因为您已经说过它被覆盖了(静态方法没有被覆盖)。首先,一旦它是丰田的对象,它就已经是汽车的对象了。仅仅因为有一辆汽车
参考并不意味着丰田
不再是丰田
。没有必要使用Toyota
调用Toyota
的print
方法,因为您已经说过Toyota
的print
方法会覆盖汽车的方法。Java中的多态性确保,如果对重写方法的子类(Toyota
)有一个超类(Car
)引用,则调用子类方法,而不是超类方法。这应该很好:
Toyota toy = (Toyota)cList.get(0);
toy.print(toy); //does this call Toyota's print method or car's print method?
或阵列版本:
Car car = cList.get(0);
car.print(car);
另外,在方法中将实例传递给自身可能是不必要的。您应该能够从方法中删除该参数(在这两个类中),只需调用:
Car car = cArray[0];
car.print(car);
另外,Car.print(Car)如果print
方法是static
,则会键入code>。这个方法不是静态的,因为你说它被覆盖了(静态方法没有被覆盖)。如果丰田是汽车的一个子类,那么你真的不需要做所有这些
car.print();
应该输出
我是一辆汽车
我是一辆丰田汽车
这两个对象都是汽车。如果丰田是汽车的一个子类,那么你真的不需要做所有这些
car.print();
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();
}
应该输出
我是一辆汽车
我是一辆丰田汽车
两个物体都是汽车
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();
}
事实上,这就是丰田的打印方式,但是,这真的是你想要的吗
如果在Toyota中重写toString()方法,则可以执行以下操作:
Toyota toy = (Toyota)cArray[0];
toy.print(toy); //this should call the Toyota's print method
被重写的方法如下所示:
System.out.println( toy );
现在不需要浇铸
事实上,这就是丰田的打印方式,但是,这真的是你想要的吗
如果在Toyota中重写toString()方法,则可以执行以下操作:
Toyota toy = (Toyota)cArray[0];
toy.print(toy); //this should call the Toyota's print method
被重写的方法如下所示:
System.out.println( toy );
现在不需要铸造。它们将成为汽车对象不,它们已经是汽车
对象了。+1,这是OO中需要理解的关键部分。对象的运行时类型与已知该对象的引用的编译时类型之间存在差异。如果您执行Car Car=new Toyota()
,则Car
引用具有Car
类型,但这不会以任何方式修改new Toyota()
对象。它们将成为Car对象不,它们已经是Car
对象。+1,这是OO中需要理解的关键部分。对象的运行时类型与已知该对象的引用的编译时类型之间存在差异。如果执行Car Car=new Toyota()
,则Car
引用的类型为Car
,但这不会以任何方式修改new Toyota()
对象。