首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类加载和初始化

类加载和初始化
EN

Stack Overflow用户
提问于 2017-08-09 18:23:19
回答 2查看 1.2K关注 0票数 0

我正试图理解类加载和初始化时的确切场景。我看到下面这两篇文章给出了不同的答案

爪哇-A类是在中初始化的,类的实例是使用new__()关键字创建的,或者使用使用class.forName()的反射创建的,这可能会在Java中抛出ClassNotFoundException。

爪哇世界-,那么类什么时候加载了__?有两种情况:执行新字节码(例如,FooClass f= new FooClass();)和字节码对类进行静态引用(例如,System.out)。

那么,当我使用新关键字创建类实例时,是加载还是初始化类呢?

另一件关于由于引用变量而导致的加载的问题需要问:

爪哇-Class加载是由Java中的类加载器完成的,它可以在另一个类引用它或延迟加载类时立即加载类,直到出现类初始化的需要为止。

在这里引用是什么意思?他是否暗示如果A类有B类的引用变量,那么B类在A中遇到引用时就会被加载?

但是下面的作者说NotUsed类没有加载,但是我看到ClassInitializationTest类有它的引用

爪哇-

/** * Java类,在此程序中不使用,因此JVM */

代码语言:javascript
运行
复制
class NotUsed {
 static { System.out.println("NotUsed Class is initialized "); }

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-09 19:28:34

您对javaworld文章感到困惑。虽然有点刺耳,但为了这个答案的目的,让我们说它是错误的,而忽略它。

来自jvm规范

Java虚拟机动态地加载、链接和初始化类和接口。加载是指查找具有特定名称的类或接口类型的二进制表示并从该二进制表示形式创建类或接口的过程。链接是将类或接口合并到Java虚拟机的运行时状态以便能够执行的过程。类或接口的初始化包括执行类或接口初始化方法

从上面突出显示的文本中,您可以确切地看到加载和初始化意味着什么,javaworld将what (错误地)作为它们的组合术语。

来自jls

12.4.1.当初始化发生时 类或接口类型T将在第一次出现以下任何一种情况之前立即初始化:

  • T是一个类,并创建了一个T的实例。
  • 调用由T声明的静态方法。
  • 指定一个由T声明的静态字段。
  • 使用由T声明的静态字段,且该字段不是常量变量(§4.12.4)。
  • T是一个顶级类(§7.6),在T (§8.1.3)中执行一个按词汇嵌套的断言语句(§14.10)。

来自javarevisited的文章:

代码语言:javascript
运行
复制
NotUsed o = null;
..
class NotUsed {
    static { System.out.println("NotUsed Class is initialized"); }
}

声明变量并不是导致初始化的原因之一,因此它没有初始化,"NotUsed Class is initialized"也不会被打印出来。如果要加载NotUsed,则规范没有定义它,使用sun的java 8上的默认ClassLoader,它将不会被加载。

票数 1
EN

Stack Overflow用户

发布于 2017-08-09 19:28:02

代码语言:javascript
运行
复制
myClass a = new myClass();

正如我所教的,第一部分是初始化,第二部分在"=“之后是加载。

您可以初始化一个类:

代码语言:javascript
运行
复制
myClass a;

然后在后面的代码中加载它:

代码语言:javascript
运行
复制
a = new myClass();

与变量初始化相同。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45598053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档