请在这段代码中解释java instanceof关键字
下面代码段的输出是012
,但是请告诉我(b2 instanceof Toy
)是如何实现的
请解释一下
interface Vessel { }
interface Toy { }
class Boat implements Vessel { }
class Speedboat extends Boat implements Toy { }
public class Tree {
public static void main(String[] args)
{
String s = "0";
Boat b = new Boat();
Boat b2 = new Speedboat();
Speedboat s2 = new Speedboat();
if((b instanceof Vessel) && (b2 instanceof Toy)) s += "1";
if((s2 instanceof Vessel) && (s2 instanceof Toy)) s += "2";
System.out.println(s);
}
}
# 1 楼答案
例如,通过线路
它试图找出s2是否在血管线的同一层次中。如果两个比较类存在于同一层次结构中,则不一定是直接关系,而是相邻或更远的关系将被回答为true。但是如果instanceof没有直接的层次结构,那么它将返回false。 像
然后
将返回false 及
将返回真值
# 2 楼答案
instanceof
测试引用是否指向其具体类型为、扩展或实现(直接或间接)给定类型的对象b2
引用的对象的类型为SpeedBoat
SpeedBoat
实现Toy
。因此b2
引用的对象是Toy
(即,是Toy的一个实例)instanceof
是现实生活中“是”的同义词。如果一个孩子给你看一艘快艇,问“那是玩具吗”,你会回答“是”。如果他问“是快艇吗”,你会回答是的。如果他问“它是物体吗”,你会回答是的。如果他问“是香蕉吗”,你会回答“不是”# 3 楼答案
请注意,instanceof应谨慎使用。如果您发现自己正在编写使用instanceof的代码,那么请研究将目标代码转移到每个子类(通常是它所属的)中的新成员方法。在您的代码中,Boat和Speedboat都可以提供一个int getScore()方法,这样就不需要instanceOf
异常处理是非常宝贵的一个方面。例如:
}
# 4 楼答案
b2
是Speedboat
的实例,该类实现了Toy
。当Speedboat
扩展Boat
时,可以将它分配给类型层次结构中更高的类型(Boat b2 = new Speedboat();
),但由于它仍然是Speedboat
(tryb2.getClass()
)的实例,b2 instanceof Toy
仍将返回true# 5 楼答案
我相信this post会帮助你清楚地理解
摘自What is the 'instanceof' operator used for?
正如邮报所解释的,由于
Toy
是由快艇实现的,因此instanceof
操作符在该条件下返回true另外,本教程的official oracle documentation将
instanceof
解释为:# 6 楼答案
您可以将对象分配给其层次结构中任何类型的变量,但是
instanceof
在求值时将始终检查对象本身b2
引用了Speedboat
对象,该对象实现了Toy
,因此b2 instanceof Toy
是真的