Java Instanceof方法混淆

Java Instanceof方法混淆,java,interface,boolean,instanceof,Java,Interface,Boolean,Instanceof,假设我们有以下定义 interface Vessel{} interface Toy{} class Boat implements Vessel{} class Speedboat extends Boat implements Toy{} 我们主要有以下几点: Boat b = new Speedboat(); 而(玩具的b实例)的计算结果为true?为什么?我的理解是b的参考类型是Boat,但是Boat与Toy无关,因此它应该是false,但根据我的理解,答案是true instanc

假设我们有以下定义

interface Vessel{}
interface Toy{}
class Boat implements Vessel{}
class Speedboat extends Boat implements Toy{}
我们主要有以下几点:

Boat b = new Speedboat();
(玩具的b实例)
的计算结果为
true
?为什么?我的理解是
b
的参考类型是
Boat
,但是
Boat
Toy
无关,因此它应该是
false
,但根据我的理解,答案是
true

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

因此,它检查对象的类型,但不检查对象引用的类型。

根据

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


因此,它会检查对象的类型,但不会检查对象的引用类型。

Boat
Toy
无关,您是对的

但是您在这里处理的不是
,而是实际的
快艇
,它存储在
变量中。而
快艇
就是
玩具
的一个例子

存储
new Speedboat()
的类型并不重要,因为Java会在运行时检查实际对象是否是其他对象的实例

这样你就可以写一些

public boolean callSpeedBoatMethodIfPossible(Boat b) {
    if (b instanceof SpeedBoat) {
        ((SpeedBoat)b).driveVerySpeedy();
    }
}

玩具
无关,你说得对

但是您在这里处理的不是
,而是实际的
快艇
,它存储在
变量中。而
快艇
就是
玩具
的一个例子

存储
new Speedboat()
的类型并不重要,因为Java会在运行时检查实际对象是否是其他对象的实例

这样你就可以写一些

public boolean callSpeedBoatMethodIfPossible(Boat b) {
    if (b instanceof SpeedBoat) {
        ((SpeedBoat)b).driveVerySpeedy();
    }
}

b
的编译类型是
Boat
。但是它的运行时类型是
快艇


编译
b
的类型是
。但是它的运行时类型是
快艇

你应该阅读。你应该阅读。