假设我们有以下定义。
interface Vessel{}
interface Toy{}
class Boat implements Vessel{}
class Speedboat extends Boat implements Toy{}
主要是,我们有这些:
Boat b = new Speedboat();
和(b instanceof Toy)
评估为true
?为什么?我的理解是b
的引用类型是Boat
,但Boat
与Toy
无关,所以它应该是false
,但答案是true
。
答案 0 :(得分:7)
Boat
与Toy
无关,你是对的。
但是您不是在这里处理Boat
,而是在SpeedBoat
变量中存储的实际Boat
。而且SpeedBoat
是Toy
的实例。
存储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?