了解java中的instanceof以及if条件?

时间:2012-07-16 08:07:34

标签: java instanceof

我不确定树(引用变量)如何成为对象Tree的实例 我的示例程序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" );  
    }  
}

5 个答案:

答案 0 :(得分:6)

由于PineOak也是IS-A Tree,因此tree instanceof Tree tree TreePine将返回true {1}}或Oak 您可以在Java Tutorials上的Inheritance了解更多信息。

答案 1 :(得分:3)

正如Keppil所说,instanceof对祖先也是如此。基于此,将发生以下情况:

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。

答案 2 :(得分:1)

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

Pine Pine() { super(); }

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

Tree Tree() { super(); }

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

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

tree instanceof Pine
tree instanceof Tree
tree instanceof Object

全部返回true

答案 3 :(得分:0)

子节点本身的实例和父类的子类型。每个类都是java.lang.Object类的子类型。 在你的例子中,Pine和Oak是Tree的子类或者可以写成 Pine和Oak是Tree类的子类型,所以

if( tree instanceof Tree ) 

是真的。

答案 4 :(得分:0)

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

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