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

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

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

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

首先说说类的初始化:

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

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

Java代码
  1. class Example {
  2. static int size = 3 * (int) (Math.random() * 5.0);
  3. }
class Example {static int size = 3 * (int) (Math.random() * 5.0);
}

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

Java代码
  1. class Example{
  2. static int size;
  3. static {
  4. size = 3 * (int) (Math.random() * 5.0);
  5. }
  6. }
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>"

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

转载于:https://www.cnblogs.com/diyunpeng/archive/2010/07/11/1775200.html

clinit和init(转载)相关推荐

  1. init.x java_详谈jvm--Java中init和clinit的区别

    init和clinit区别 ①init和clinit方法执行时机不同 init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的 constructor 方法时才会执行init方法, ...

  2. R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲

    这两天,由于要做一个文本分析的内容,所以搜索了一天R语言中的可以做文本分析的加载包,但是在安装包的过程,真是被虐千百遍,总是安装不成功.特此专门写一篇博文,把整个心塞史畅快的释放一下. ------- ...

  3. Zeppelin-在Flink和Spark集群的安装

    2019独角兽企业重金招聘Python工程师标准>>> 该教程主要面向Zeppelin的入门者.不需要太多的关于 Linux, git, 或其它工具的基础知识.如果你按照这里的方法逐 ...

  4. JS设计模式(13)状态模式

    什么是状态模式? 定义:将事物内部的每个状态分别封装成类,内部状态改变会产生不同行为. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:代码中包含大 ...

  5. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  6. docker centos 无法用systemctl 启动服务的问题

    2019独角兽企业重金招聘Python工程师标准>>> 在Centos7的Docker里装好了httpd,运行报错: systemctl start httpd.service Fa ...

  7. iOS开发之用到的几种锁整理

    1. iOS中的互斥锁 在编程中,引入对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为"互斥锁"的标记,这个标记用来保证在任一时刻,只能有一个线程访问对象. ...

  8. docker容器内部无法ping通域名?

    2019独角兽企业重金招聘Python工程师标准>>> 1.宿主机上搭建了dns服务器,在宿主机上可以ping通域名 2.进入容器中却ping不通域名 ping: xxx.sss.c ...

  9. Scala微服务架构 三

    四 Controller层 之前我们已经把基层架构搭建好了,那么要如何使用呢? 首先看看我的Controller层代码 @Singleton class BMAuthController @Injec ...

  10. centos7上开启单用户模式

    author: headsen  chen date : 2018-08-02  11:23:16 1,在出现centos7的页面的时候,按 e进入到编译内核的界面 2,找到下面的这一段,将ro 该车 ...

最新文章

  1. 文巾解题 面试题 01.01. 判定字符是否唯一
  2. 前台提示_提示一下大家,如果考试科目不合格,可以到前台自助机查询
  3. svn 提交到远程仓库_聊聊如何从SVN迁移源码到Git仓库
  4. admin.0001_initial is applied before its dependency users.0001_initial on database 'default
  5. Ubuntu 18.04 忘记 mysql root密码及其重置
  6. 爬虫使用urllib库报错urllib.error.URLError: 「urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate veri
  7. oracle 两表两列数据对比_【SQL】根据两列信息,整合两张表数据
  8. Nginx服务器的压缩功能和缓存功能
  9. progressDialog 为什么设置了setProgress()方法无反应?
  10. 录屏软件|录屏软件下载|录屏软件哪个好用电脑无水印版
  11. 型材行业ERP-MES应用点滴
  12. IntelliJ IDEA有些快捷键无法使用的解决方式
  13. 【雅思大作文考官范文】——第十五篇:'high salaries' essay
  14. 12306火车时刻表查询接口
  15. 拉文大学计算机科学,美国研究生语言双录取,这些大学有你中意的吗?
  16. 北邮计算机网络实践第四次实验,北邮计算机网络技术实践实验四实验报告.doc...
  17. jsp学习 jdbc连接数据库实现登录注册
  18. Node【初识Node】
  19. AVI的音视频编码格式
  20. 13 服务:愿意为您效劳

热门文章

  1. 关于Windows高DPI的一些简单总结
  2. 测试工程师值得被尊重!是否有此共鸣!
  3. Java锁的升降级及synchoronized优化
  4. 开源Docker管理工具kubernetes的简易安装和使用
  5. axure 7.0 7.0.0.3142 简体中文版(附汉化包注册)
  6. laravel composer 安装指定版本以及基本的配置
  7. fedro1 16 64位安装oracle 11.2.0.1遇到的问题
  8. Docker 外部访问容器Pp、数据管理volume、网络network 介绍
  9. Leetcode那点事儿
  10. ads出现村田电容电感无法仿真的问题解决(`BJT1' is an instance of an undefined model `BJTM1')...