继承和'Instanceof'测试结果

时间:2015-04-28 09:54:14

标签: java

我正在研究'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);
    }
}

5 个答案:

答案 0 :(得分:7)

宣言!=价值

您将car声明为Car,但值为FireEngine

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

缩短可能有助于理解:

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

答案 1 :(得分:1)

instanceof的输出取决于您正在测试其类型的变量的运行时类型。变量的编译时类型并不重要(只要x instanceof Y可能会为x的某个值返回true,否则表达式不会通过编译)。

carfireCar都会在您的代码中保存FireEngine的实例。由于FireEngine是一种CarcarfireCarinstanceof CarFireEngine,所以您的代码会打印truetrue

答案 2 :(得分:1)

  

实施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

答案 3 :(得分:1)

  

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

在你的情况下:

 Car car = new FireEngine();

Car是静态类型,FireEngine是动态类型。这意味着,您实际上正在使用FireEngine(对象类型)。您可以将Car想象成一个特殊的指针,其汽车形状指向真实的对象,即令人敬畏的FireEngine。如果您阅读' instanceof'您可以理解它,此方法会告诉您对象是否是类的实例,而不是引用。那么编译器会看到:FireEngine(car)instanceOf FireEngine?当然,让我们回归真实!

您也可以查看这篇文章:What is the 'instanceof' operator used for?

答案 4 :(得分:1)

声明

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不检查孩子,它会测试父母。