我正在研究'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);
}
}
答案 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,否则表达式不会通过编译)。
car
和fireCar
都会在您的代码中保存FireEngine
的实例。由于FireEngine
是一种Car
,car
和fireCar
都instanceof
Car
和FireEngine
,所以您的代码会打印true
和true
。
答案 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
不检查孩子,它会测试父母。