Java 继承和';Instanceof';测试结果

Java 继承和';Instanceof';测试结果,java,Java,我正在学习“instanceof”java,但我不能清楚地理解“instanceof”,我认为下面的答案是对的和错的,但结果都是对的。你能解释一下为什么会出现这种结果吗?正如我所知,当A是B(父对象)的子对象,而B的实例是“false”,但结果与我所想的不同 class Car{ String color; int door; } class FireEngine extends Car{ void water(){ System.out.

我正在学习“instanceof”java,但我不能清楚地理解“instanceof”,我认为下面的答案是对的和错的,但结果都是对的。你能解释一下为什么会出现这种结果吗?正如我所知,当A是B(父对象)的子对象,而B的实例是“false”,但结果与我所想的不同

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);
    }
}

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

car
fireCar
都在代码中包含
firenergy
的实例。由于
消防车
是一种
汽车
,所以
汽车
消防车
都是
汽车
消防车
的实例,所以您的代码打印
声明!=价值 您将
汽车
声明为汽车,但该值是
消防发动机

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

缩短可能有助于理解:

System.out.println(new FireEngine() instanceof FireEngine);  // true
System.out.println(new FireEngine() instanceof Car);         // true
Instanceof运算符的实现。如果对象参数(可以是表达式)是类类型的实例,则返回布尔值

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

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

有关更多信息,请浏览javadocs@

有关示例的更详细说明,请浏览以下网页:

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

就你而言:

 Car car = new FireEngine();
汽车为静态型,消防车为动态型。这意味着,您实际上正在使用消防车(对象类型)。你可以把汽车想象成一个特殊的指针,它的形状指向真正的物体,那就是你那令人敬畏的消防车。如果阅读“instanceof”,您可以理解它,此方法会告诉您对象是否是类的实例,而不是引用。因此编译器将看到:FireEngine(汽车)实例FireEngine?当然,让我们返回一个真实的

你也可以看看这篇文章:

声明

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
不检查子对象,而是测试父对象。

您需要了解变量类型和对象类型之间的差异。变量
car
具有类型
car
,但其值为类型
firenergy
。假设变量是一个瓶子,瓶子可以装液体。啤酒是液体,所以你可以把它装在瓶子里。如果这样做,
啤酒瓶实例
将返回true,即使啤酒瓶没有标记为啤酒瓶。消防车是汽车,消防车是消防车。这是关于实例化的对象,而不是关于如何定义变量。就我的两分钱:在实际代码中,当使用
instanceof
时,它是一个变量的95%。将其用于学习目的并理解类型和多态性是100%好的,但是在将来,当您实际编写代码时,并且必须使用
instanceof
-它应该发出一个红色信号,表明“这里的某些东西可能设计得很差”。