1

简单的java代码片段。它有三个班级。编译代码后请删除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

我猜想在任何时候都不需要加载类 A,即使 B 中有它的实例,因为你永远不会实例化 B 的实例。

JVM 在加载类时非常懒惰。当您实例化该类的对象时(第一次),当您使用 Class.forName() 显式加载类时,或者当您以需要来自它的信息的方式引用该类时(尝试访问来自 B 的静态初始化程序的 A 的静态成员,并看到 A 将被加载。

于 2010-03-23T09:41:28.773 回答
1

因为你没有重新编译它,只是运行这个类。

于 2010-03-23T09:35:16.557 回答
0

代码中没有使用 A 类(即在 main 方法中)。

在运行时,类在使用时被加载。那时,你会得到一个 ClassNotFoundError。但是,如果您不使用该类,则不需要它在那里。

尝试创建一个 B 的实例(它需要一个 A 的实例),然后你会得到一个错误。

于 2010-03-23T09:39:31.740 回答
0

除了 Gordon 的回答,您只是在运行该类,并且不需要 A 类,如果您调用 A 的构造函数或引用 A 中的静态字段或方法,那么您将得到ClassNotFoundException您所期望的

于 2010-03-23T09:40:52.707 回答