1

シンプルな Java コード スニペット。3つのクラスがあります。コードをコンパイルしたら、A.class を削除してからコードを実行してください。コードはまだ実行されますが、A のバイト コードが存在するかどうかを確認しないのはなぜですか?

class A {
    static {
        System.out.println("In the class A");
    }

    public A() {
    }
}

class B {
    private A a = null;

    static {
        System.out.println("In the class B");
    }

    public B() {
        a = new A();
    }
}

public class ExampleLinkage {
    static {
        System.out.println("In the class A");
    }

    public ExampleLinkage(String str) {
    }

    public static void main(String args[]) {
        try {
            System.out.println("In the main method of ExampleLinkage");
            Class.forName("com.bt.rtti.B");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
4

4 に答える 4

5

B のインスタンスをインスタンス化することはないため、B 内にクラス A のインスタンスがあっても、クラス A をロードする必要はまったくないと思います。

クラスをロードするとき、JVMは非常に怠惰です。そのクラスのオブジェクトを (最初に) インスタンス化するとき、Class.forName() を使用してクラスを明示的にロードするとき、またはクラスからの情報を必要とする方法でクラスを参照するとき ( B の静的イニシャライザから A の静的メンバを取得し、A がロードされることを確認します。

于 2010-03-23T09:41:28.773 に答える
1

再コンパイルしないので、クラスを実行するだけです。

于 2010-03-23T09:35:16.557 に答える
0

クラス A は、コード (つまり、メイン メソッド) では使用されません。

実行時に、クラスは使用中にロードされます。その時点で、ClassNotFoundError が発生します。ただし、クラスを使用していない場合は、そこにある必要はありません。

B のインスタンス (A のインスタンスが必要) を作成しようとすると、エラーが発生します。

于 2010-03-23T09:39:31.740 に答える
0

ゴードンの答えに加えて、クラスを実行しているだけで、クラス A は必要ありません。A のコンストラクターを呼び出した場合、または A の静的フィールドまたはメソッドを参照したClassNotFoundException場合は、期待どおりの結果が得られます。

于 2010-03-23T09:40:52.707 に答える