基本继承 - 需要一行代码解释

时间:2014-03-16 14:41:13

标签: java inheritance

public int getPassengerCount() {
    int counter = 0;
    for (TrainCar vogn : YOLO) {
        if (vogn.getClass() == PassengerCar.class) {
            counter += ((PassengerCar) vogn).getPassengerCount(); //This line
        }   
    } return counter;
}

在此代码中,我遍历Arraylist TrainCars

两种TrainCars; PassengerCarCargoCar。所以首先我检查旅行车是否是班级PassengerCar的一个实例(我知道instanceof,但我认为这种方式有效吗?),如果是的话,我需要抓住包含乘客数量的字段,即方法getPassengerCount()

然而,在标记的行中,有一些我不完全理解的代码。我意识到我不能写vogn.getPassengerCount(),因为" vogn"可以是CargoCarPassengerCar。然后,我在if子句之后再这样做,所以它不应该导致错误。那我为什么不呢?为什么这是唯一可行的方式,它的作用是什么?我从来没有见过这样的语法,老实说我不知道​​谷歌是什么。有什么建议? : - )

4 个答案:

答案 0 :(得分:3)

在编译时,方法基于调用它们的表达式的静态/声明类型来解析。

正如您所说,getPassengerCount()方法仅存在于PassengerCar类型上。因此,您只能在解析为PassengerCar实例的表达式上调用该方法。您可以通过将类型为TrainCar的变量转换为更具体的PassengerCar来实现此目的。

((PassengerCar) vogn)

仅当您知道vogn引用PassengerCar时才执行此操作,否则您将获得ClassCastException

答案 1 :(得分:1)

(假设TrainCar没有getPassengerCount()方法)

嗯,假设说明了一切。 vogn包含对TrainCar而非PassengerCar的实例的引用。由于TrainCar没有该方法,因此您需要将其向下转换为具有该方法的子类。这就是为什么演员阵容是必需的,即使你是程序员,现在你已经拥有PassengerCar的实例。

答案 2 :(得分:1)

counter += ((PassengerCar) vogn).getPassengerCount(); //This line

嗯......让我们看看。

如果vognPassengerCar的实例,则会将该车中的乘客数量与乘客总数相加。

因此,有必要vogn对象强制转换为其子类以访问方法getPassengerCount()TrainCar中可能不存在public int getPassengerCount() { int counter = 0; for (TrainCar vogn : YOLO) { if (vogn instanceof PassengerCar) { //This is easier :-) counter += ((PassengerCar) vogn).getPassengerCount(); } } return counter; } })。

更好的方法是:

{{1}}

答案 3 :(得分:1)

我认为这个问题更像是为什么Java会以这种方式做出反应?"比#34;这是正常的吗?"。 想想另一种方式,如果你的情况如何

if (vogn instanceof PassengerClass || a == b)

然后,如果a == b和vogn不是PassengerClass的实例,那么您将调用一个可能与PassengerClass不同的类的方法。 在某种情况下可能有许多陈述的事实似乎是一个很好的理由,说明为什么你所说的语法是危险的。