Java Instanceof方法混淆

时间:2015-12-28 16:18:24

标签: java interface boolean instanceof

假设我们有以下定义。

interface Vessel{}
interface Toy{}
class Boat implements Vessel{}
class Speedboat extends Boat implements Toy{}

主要是,我们有这些:

Boat b = new Speedboat();

(b instanceof Toy)评估为true?为什么?我的理解是b的引用类型是Boat,但BoatToy无关,所以它应该是false,但答案是true

3 个答案:

答案 0 :(得分:7)

BoatToy无关,你是对的。

但是您不是在这里处理Boat,而是在SpeedBoat变量中存储的实际Boat。而且SpeedBoatToy的实例。

存储new Speedboat()的类型无关紧要,因为Java在运行时检查是否实际对象是 的其他实例。

这样你就可以写出像

这样的东西
public boolean callSpeedBoatMethodIfPossible(Boat b) {
    if (b instanceof SpeedBoat) {
        ((SpeedBoat)b).driveVerySpeedy();
    }
}

答案 1 :(得分:3)

根据http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

  

instanceof运算符将对象与指定类型进行比较。您可以使用它来测试对象是否是类的实例,子类的实例或实现特定接口的类的实例。

因此它检查OBJECT的类型,但不检查对象的REFERENCE类型。

答案 2 :(得分:2)

b的编译类型为Boat。但其运行时类型为Speedboat

What is the difference between a compile time type vs run time type for any object in Java?