【问题标题】:Inheritance and 'Instanceof' testing result继承和“Instanceof”测试结果
【发布时间】:2015-04-28 09:54:13
【问题描述】:

我正在学习'instanceof' java,但我无法清楚地理解'instanceof',我认为下面的答案是真假,但结果都是正确的。你能解释一下为什么会出现这个结果吗?据我所知,当 A 是 B(父母)的孩子,而 B 的实例是“假”但结果与我的想法不同。

class Car{
    String color;
    int door;       
}

class FireEngine extends Car{
    void water(){
        System.out.println("water");
    }
}

public class Operator {
    public static void main(String[] args) {
        Car car = new FireEngine();
        FireEngine fireCar = new FireEngine();

        System.out.println(car instanceof FireEngine);
        System.out.println(fireCar instanceof Car);
    }
}

【问题讨论】:

  • 你需要了解变量类型和对象类型的区别。变量car 的类型为Car,但其值为FireEngine 类型。想象变量是一个瓶子,一个瓶子可以装液体。啤酒是液体,因此您可以将其放入瓶中。如果您这样做,bottle instanceof Beer 将返回 true,即使瓶子没有标记为啤酒瓶。
  • FireEngine 是汽车,FireEngine 是 FireEngine。这是关于实例化的对象,而不是关于如何定义变量。
  • 只是我的两分钱:在实际代码中,当使用instanceof 时,95% 的时间是code smell。将它用于学习目的和理解类型和多态性是 100% 没问题的,但是在将来,当您实际编写代码并且必须使用 instanceof - 它应该会引发一个危险信号,表明“这里有一些东西是可能设计不佳”。

标签: java


【解决方案1】:

声明 != 值

您将car 声明为汽车,但值是FireEngine

instanceof 工作基于,而不是基于其变量的声明!!!

缩短可能有助于理解:

System.out.println(new FireEngine() instanceof FireEngine);  // true
System.out.println(new FireEngine() instanceof Car);         // true

【讨论】:

    【解决方案2】:

    instanceof 的输出取决于您正在测试其类型的变量的运行时类型。变量的编译时间类型无关紧要(只要x instanceof Y 可能对x 的某个值返回true,否则表达式将无法通过编译)。

    carfireCar 在您的代码中都包含 FireEngine 的实例。由于FireEngineCar 的一种,carfireCar 都是instanceof CarFireEngine,所以你的代码打印truetrue

    【讨论】:

      【解决方案3】:

      Instanceof 运算符的实现。如果 Object 参数(可以是表达式)是类类型的实例,则返回布尔值。

      输入 1:返回对象的对象或表达式。

      输入 2:一个类或返回一个类的表达式 返回:一个布尔值,它是针对 Class 测试对象的结果。

      更多信息请通过javadocs@http://docs.oracle.com/cd/E13155_01/wlp/docs103/javadoc/com/bea/p13n/expression/operator/Instanceof.html

      更详细的例子说明请浏览以下网页:http://mindprod.com/jgloss/instanceof.html

      【讨论】:

        【解决方案4】:

        在 Java 中有两种类型的绑定:静态(引用类型) 和动态(对象类型)。

        在你的情况下:

         Car car = new FireEngine();
        

        Car 是静态类型,FireEngine 是动态类型。这意味着,您实际上是在使用 FireEngine(object 类型)。你可以把 Car 想象成一个特殊的指针,它有一个汽车形状,指向你的真棒 FireEngine 的真实对象。如果你读过'instanceof'就可以理解,这个方法告诉你一个object是否是一个类的实例,而不是引用。所以编译器会看到:FireEngine (car) instanceOf FireEngine?当然,让我们返回一个 true!

        你也可以看看这个帖子:What is the 'instanceof' operator used for?

        【讨论】:

          【解决方案5】:

          声明

          As I know, when A is child of B (Parent), 
          and a instanceof B is 'false' but result is different with what I thought.
          

          不正确。 instanceof 不检查孩子,而是检查父母。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多