3

我不确定在我的示例程序 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" );  
    }  
}
4

5 回答 5

6

由于 aPine或 anOak也是 IS-A ,因此无论是还是,Treetree instanceof Tree都将返回 true 。您可以在Java 教程 中阅读更多内容。treeTreePineOak
Inheritance

于 2012-07-16T08:10:23.037 回答
3

正如 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。

于 2012-07-16T08:15:58.357 回答
1

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

Pine Pine() { super(); }

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

Tree Tree() { super(); }

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

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

tree instanceof Pine
tree instanceof Tree
tree instanceof Object

全部返回真

于 2012-07-16T08:17:29.490 回答
0

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

if( tree instanceof Tree ) 

是真的。

于 2012-07-16T08:13:37.293 回答
0

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

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

于 2012-07-16T08:15:08.077 回答