【问题标题】:Java Instanceof method Confusion [duplicate]Java Instanceof方法混淆[重复]
【发布时间】:2016-04-02 12:06:37
【问题描述】:

假设我们有以下定义。

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

【问题讨论】:

标签: java interface boolean instanceof


【解决方案1】:

BoatToy 无关,你是对的。

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

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

这样你就可以写出类似的东西

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

【讨论】:

    【解决方案2】:

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

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

    所以它检查一个 OBJECT 的类型,但不检查该对象的 REFERENCE 类型。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 2012-08-12
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多