`
freesoftman
  • 浏览: 318795 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

<init>与<clinit>的区别

阅读更多

今天在看深入Java虚拟机的class文件结构时,看到了这么一句话,

可能出现在class文件中的两种编译器产生的方法是:实例初始化方法(名为<init>)和类与接口初始化方法(名为<clinit>)。

 

这两种方法有什么区别呢?

首先:这两个方法一个是虚拟机在装载一个类初始化的时候调用的(clinit)。另一个是在类实例化时调用的(init)

 

首先说说类的初始化:

在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化语句给出的。一个类变量初始化语句是

变量声明后的等号和表达式:

class Example {
       static int size = 3 * (int) (Math.random() * 5.0);
}

 

静态初始化语句是一个以static开头的语句块:

class Example{
     static int size;
     static {
           size = 3 * (int) (Math.random() * 5.0);
     }
}

 所有的类变量初始化语句和类型的静态初始化语句都被Java编译器收集到了一起,放在一个特殊的方法中。这个方法就是<clinit>

 

我们在来看看<init>这个方法:

<init>方法是在一个类进行对象实例化时调用的。实例化一个类有四种途径:调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。

 

Java编译器会为它的每一个类都至少生成一个实例初始化方法。在Class文件中,被称为"<init>"

 

现在知道了吧, 一个是用于初始化静态的类变量, 一个是初始化实例变量!

分享到:
评论
1 楼 浪客剑心 2009-12-10  
谢谢啦 帮忙啦!!!

相关推荐

    深入Java初始化.pdf

    在上述代码示例中,`debug.MyTest`类中的静态变量`i`除以0导致`ArithmeticException`,异常信息显示在`&lt;clinit&gt;`方法中,这证实了`&lt;clinit&gt;`与类的静态初始化有关。 对象初始化方法:&lt;init&gt; `&lt;init&gt;`方法则是用于...

    17 - MethodVisitor生成静态方法 - 简书1

    这里有两个方法:一个构造器`&lt;init&gt;`和静态初始化方法`&lt;clinit&gt;`。使用`cw.visitMethod()`生成方法的访问者对象`MethodVisitor`,然后通过访问者对象的方法来构建字节码。 对于构造器`&lt;init&gt;`,我们通常会调用超类...

    android 使用poi读取高版本excel

    at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.&lt;clinit&gt;(PackagePropertiesMarshaller.java:41) at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161) ...

    详谈jvm--Java中init和clinit的区别

    JVM 中 init 和 clinit 的区别详解 Java 虚拟机(JVM)是 Java 语言的核心组件之一,负责将 Java 字节码转换为机器码并执行。其中,init 和 clinit 是两个重要的概念,它们分别是实例构造器和类构造器,在 Java ...

    jacob.jar1.19及使用方法

    at MsWordEdit.&lt;init&gt;(MsWordEdit.java:25) at MsWordEdit.main(MsWordEdit.java:642) 如果不清楚java.library.path,输出一下即可。代码如下 System.out.println(System.getProperty("java.library.path"));

    类初始化和实例初始化1

    JVM会在类加载时生成一个名为&lt;clinit&gt;()的特殊方法,用于聚合这些静态初始化操作,&lt;clinit&gt;()方法只执行一次。 接下来是实例初始化,也就是当我们创建一个新的对象时发生的过程: 1. 分配内存:为新对象分配内存...

    jd-gui反编译插件,查看class文件

    - **代码质量**:由于反编译过程中可能会丢失部分元数据,生成的源代码可能与原始代码有所差异,例如方法名可能变为默认的`&lt;init&gt;`和`&lt;clinit&gt;`,变量名可能变为`arg0`、`arg1`等。 - **版权问题**:在商业项目中,...

    通过Java字节码发现有趣的内幕之初始化篇(下)Java开

    其中,初始化阶段是执行类的初始化方法&lt;clinit&gt;()的时刻,它包含了类的所有静态变量的初始化和静态代码块的执行。 接着,让我们关注实例初始化。每当创建一个新对象时,都会执行实例初始化。这部分代码通常在构造...

    jdb分析文档.pdf

    - `stop on com.baidu.mobads.remote.JsInterface.&lt;init&gt;()` - `stop on com.baidu.mobads.remote.JsInterface.watchTemperature(java.lang.String)` - `stop on android.webkit.WebViewCore.loadUrl` - 将这些...

    6_Java基础.docx

    - **注意**:`&lt;clinit&gt;`方法不是类的构造器,它是字节码文件中的一种特殊方法,只能被JVM识别。 #### 虚拟机栈生命周期 1. **栈的生命周期**:虚拟机栈的生命周期与线程的生命周期一致。线程创建时创建栈,线程...

    java解析class文件

    在方法表中,最特别的是初始化方法(&lt;clinit&gt;),它是Java类加载时执行的静态初始化代码块。而实例构造器(&lt;init&gt;)则是对象创建时执行的初始化代码。 类文件还包含一个异常表(Exception Table),用于在字节码...

    clinit-cfn-tool:Cloudinit 从 AWS CloudFormation 注入提取物

    clinit-cfn-工具Cloudinit 注入/提取到/从 AWS CloudFormation。 创建此工具的动机是使用与 CloudInit 用户数据文件集成的 CloudFormation 的非常烦人/困难的工作方式。 AWS CloudFormation 使用 JSON 格式,而 ...

    Java虚拟机规范SE8英文

    - **&lt;clinit&gt; 方法**:用于初始化类或接口的静态成员。 #### 八、异常处理 - **异常体系**:Java虚拟机支持异常处理机制,可以通过try-catch-finally语句来捕获和处理异常。 - **异常传播**:如果方法没有处理异常...

    JAVAJ2EE面试2题集

    - **初始化**: 类的初始化阶段会执行类构造器 `&lt;clinit&gt;` 方法,用于初始化类变量。 #### 1.4 状态管理 - **状态**: Java中对象的状态可以通过其成员变量来表示,这些状态可以在对象生命周期中发生变化。 - **状态...

    JVM 面试题总结.md

    3. **初始化对象**:初始化对象的字段为默认值,然后执行对象构造器`&lt;init&gt;()`方法以初始化对象的状态。 4. **设置对象头**:设置对象的对象头信息,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等...

    java面试笔试题整理

    - **初始化**:执行类构造器`&lt;clinit&gt;()`方法,这是类加载过程的最后一个阶段。 #### 3. 数据类型包装类 Java提供了八种基本数据类型的包装类: - `boolean` -&gt; `Boolean` - `char` -&gt; `Character` - `byte` -&gt; `...

    java就业培训教程(个人整理)

    - **初始化**:执行类的构造器&lt;clinit&gt;()方法。 - **1.7 垃圾回收器**: - **概念**:自动管理内存,释放不再使用的对象所占用的空间。 - **机制**:标记-清除算法、复制算法、分代收集等。 - **触发条件**:堆...

    点文件

    例如,一个Common Lisp开发者可能会有一个名为`.clinit.lisp`的点文件,这个文件会在启动Common Lisp环境时自动加载,用于定制环境设置和加载个人的库或工具。 在压缩文件`dotfiles-master`中,我们很可能看到的是...

Global site tag (gtag.js) - Google Analytics