请在此片段中解释java instanceof关键字

时间:2014-05-08 07:55:14

标签: java

以下代码段的输出为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);  
     }  
}  

7 个答案:

答案 0 :(得分:1)

您可以将对象分配给其层次结构中任何类型的变量,但instanceof将始终在评估时检查对象本身。 b2引用Speedboat对象,该对象实现Toy,因此b2 instanceof Toy为真。

答案 1 :(得分:0)

我相信this post会帮助您清楚地理解。

取自What is the 'instanceof' operator used for?

  

instanceof关键字是一个二进制运算符,用于测试对象是否存在   (instance)是给定Type的子类型。

正如帖子所解释的那样,由于Toy是由SpeedBoat实现的,instanceof运算符会为该条件返回true。

同样,official oracle documentation教程将instanceof解释为:

  

instanceof运算符将对象与指定类型进行比较。您   可以使用它来测试对象是否是类的实例,实例   子类的实现,或实现特定的类的实例   接口

答案 2 :(得分:0)

instanceof测试引用是否指向具体类型为,扩展或实现(直接或间接)给定类型的对象。

b2引用的对象属于SpeedBoat类型。 SpeedBoat实施Toy。因此b2引用的对象是Toy(即玩具的实例)。

instanceof是&#34的同义词;是"在真实生活中。如果一个孩子向你展示一艘快艇,并问这是一个玩具",你会回答是的。如果他要求"它是快艇",你会回答是的。如果他要求"它是一个对象",你会回答是。如果他问'#34;它是香蕉",你会回答否。

答案 3 :(得分:0)

b2Speedboat的实例,是实现Toy的类。当Speedboat扩展Boat时,可以将其分配给类型层次结构中更高的类型(Boat b2 = new Speedboat();),但因为它仍然是Speedboat的实例(尝试b2.getClass()),b2 instanceof Toy仍然会返回true。

答案 4 :(得分:0)

例如,行

   s2 instanceof Vessel 

它试图找出s2是否在Vessel行的同一层次结构中。如果2比较类存在于同一层次结构中,则不一定是直接关系,而是在下一个或更远的关系旁边将得到回答。但是如果instanceof没有直接的层次结构,它将返回false。 像

    interface A{..}

    interface B{..}

    class C implements A {..}

然后

    C instanceof B 

将返回false 和

    C instanceof A 

将返回true

答案 5 :(得分:0)

请注意,应谨慎使用instanceof。如果您发现自己正在编写使用instanceof的代码,那么请研究将目标代码转移到每个子类中的新成员方法(通常是它所属的位置)。在你的代码中,Boat和Speedboat都可以提供一个getScore()方法来消除对instanceOf的需求。

一个非常宝贵的地方是异常处理。例如:

try {
  .. Access the database
} catch (Exception ex) {
  if (ex instanceof SQLException) {
    .. Process the details of the database exception to log more detail
  } else {
    throw ex;

}

答案 6 :(得分:-2)

(a instanceOf b)表示只有当a属于b的类型时,instanceOf运算符才返回true。 前 - 如果狗是一个超级类,小狗是一个子类。然后(狗实例小狗返回)是真的。

在你的例子中它的船只 - >船 - > speedBoat