Java 在数组vs 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),但是编译器声

如果我使用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
调用
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()
对象。