3

サンプルプログラム53,00で、ツリー(参照変数)がオブジェクトTreeのインスタンスになった方法がわかりません。出力として「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

PineまたはOakまた IS-ATreeであるため、is 、またはのいずれであってもtree instanceof Treetrue を返します。 詳細については、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

すべてtrueを返します

于 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 のインスタンスです。

あなたのコーディング スタイルについては、instanceof 演算子に注意することをお勧めします。

于 2012-07-16T08:15:08.077 に答える