【问题标题】:Understanding instanceof in java along with if condition?了解java中的instanceof以及if条件?
【发布时间】:2012-07-16 08:07:33
【问题描述】:

我不确定树(引用变量)如何成为对象树的实例 我的示例程序 53,00?我期待“Pine”和“oops”作为输出,但为什么“Tree”包含在输出中?我根本没有给 Tree tree = new Tree() 。

    class Tree{}  
class Pine extends Tree{}  
class Oak extends Tree{}  
public class forrest {    

    public static void main( String[] args )      
    {    
        Tree tree = new Pine();   


        if( tree instanceof Pine )      
            System.out.println( "Pine" );   
        if( tree instanceof Tree )       
            System.out.println( "Tree" );  
        if( tree instanceof Oak )      
            System.out.println( "Oak" );   
        else System.out.println( "Oops" );  
    }  
}

【问题讨论】:

  • 我建议您开始将您的 if 块包含在 {...}s 中。我不确定 if 块是否符合您的预期。

标签: java instanceof


【解决方案1】:

由于PineOak 也是IS-A Tree,因此无论treeTreePine 还是Oak,您的tree instanceof Tree 都将返回true。
您可以在Java Tutorials 中阅读有关Inheritance 的更多信息。

【讨论】:

    【解决方案2】:

    正如 Keppil 所说,instanceof 在祖先上也返回 true。基于此,会发生以下情况:

    Tree tree = new Pine()
    
    tree instanceof Pine; // true
    tree instanceof Oak; // false
    tree instanceof Tree; // true
    tree instanceof Object; // true
    
    Object something = new Oak();
    
    something instanceof Pine; // false
    something instanceof Oak; // true
    something instanceof Tree; // true
    something instanceof Object; // true
    

    其实instanceof Object总是会返回true。

    【讨论】:

      【解决方案3】:

      您的 Pine 类有一个隐式构造函数(编译器会将其放置在那里,除非您手动定义自己的构造函数,在这种情况下将使用您的构造函数)。所有子类都必须调用其父类(超类)作为其构造函数的一部分。不这样做会导致抛出异常。所以你有一个隐含的

      Pine Pine() { super(); }
      

      调用它的超类的隐式构造函数(Tree;这就是“super()”所做的),看起来像

      Tree Tree() { super(); }
      

      调用它的超类(对象)的隐式构造函数...

      因此,如果树是松树,那么

      tree instanceof Pine
      tree instanceof Tree
      tree instanceof Object
      

      全部返回真

      【讨论】:

        【解决方案4】:

        一个孩子是它自己的实例和它的父类的子类型。每个类都是 java.lang.Object 类的子类型。 在您的示例中,Pine 和 Oak 是 Tree 的子类,或者可以写为 Pine 和 Oak 是 Tree 类的子类型,所以

        if( tree instanceof Tree ) 
        

        是真的。

        【讨论】:

          【解决方案5】:

          每个子类“都是”其超类的类型。 由于您的“树”是从 Tree 类扩展的 Pine 类的实例,因此它是 Tree 的实例。

          对于你的编码风格,我建议阅读Beware of instanceof operator

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-29
            • 2020-11-02
            • 2011-03-20
            • 2016-02-26
            • 2014-01-23
            • 1970-01-01
            相关资源
            最近更新 更多