我正试图理解类加载和初始化时的确切场景。我看到下面这两篇文章给出了不同的答案
爪哇-A类是在中初始化的,类的实例是使用new__()关键字创建的,或者使用使用class.forName()的反射创建的,这可能会在Java中抛出ClassNotFoundException。
爪哇世界-,那么类什么时候加载了__?有两种情况:执行新字节码(例如,FooClass f= new FooClass();)和字节码对类进行静态引用(例如,System.out)。
那么,当我使用新关键字创建类实例时,是加载还是初始化类呢?
另一件关于由于引用变量而导致的加载的问题需要问:
爪哇-Class加载是由Java中的类加载器完成的,它可以在另一个类引用它或延迟加载类时立即加载类,直到出现类初始化的需要为止。
在这里引用是什么意思?他是否暗示如果A类有B类的引用变量,那么B类在A中遇到引用时就会被加载?
但是下面的作者说NotUsed类没有加载,但是我看到ClassInitializationTest类有它的引用
爪哇-
/** * Java类,在此程序中不使用,因此JVM */
class NotUsed {
static { System.out.println("NotUsed Class is initialized "); }
}
发布于 2017-08-09 11:28:34
您对javaworld文章感到困惑。虽然有点刺耳,但为了这个答案的目的,让我们说它是错误的,而忽略它。
来自jvm规范
Java虚拟机动态地加载、链接和初始化类和接口。加载是指查找具有特定名称的类或接口类型的二进制表示并从该二进制表示形式创建类或接口的过程。链接是将类或接口合并到Java虚拟机的运行时状态以便能够执行的过程。类或接口的初始化包括执行类或接口初始化方法。
从上面突出显示的文本中,您可以确切地看到加载和初始化意味着什么,javaworld将what (错误地)作为它们的组合术语。
来自jls
12.4.1.当初始化发生时 类或接口类型T将在第一次出现以下任何一种情况之前立即初始化:
来自javarevisited的文章:
NotUsed o = null;
..
class NotUsed {
static { System.out.println("NotUsed Class is initialized"); }
}
声明变量并不是导致初始化的原因之一,因此它没有初始化,"NotUsed Class is initialized"
也不会被打印出来。如果要加载NotUsed
,则规范没有定义它,使用sun的java 8上的默认ClassLoader
,它将不会被加载。
发布于 2017-08-09 11:28:02
myClass a = new myClass();
正如我所教的,第一部分是初始化,第二部分在"=“之后是加载。
您可以初始化一个类:
myClass a;
然后在后面的代码中加载它:
a = new myClass();
与变量初始化相同。
https://stackoverflow.com/questions/45598053
复制相似问题