<init>与<clinit>的区别
来源:互联网 发布:php后期静态绑定 编辑:程序博客网 时间:2024/05/16 06:30
可能出现在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>。
<clinit>不是类必须的方法,比如如果一个类中没有静态块或者静态成员变量,那么编译器就不会为这个类生成<clinit>方法。
父类的<clinit>方法先于子类的<clinit>方法,虚拟机会保证在子类的<clinit>执行之前父类的<clinit>方法一定执行过了,说明虚拟机中第一个执行的是Object的<clinit>方法。
接口中不能使用静态代码块,但是可以使用静态成员变量,所以接口中可以存在<clinit>方法。执行接口中的<clinit>方法不必要限制性父接口中的<clinit>方法,只有当父接口中的静态成员变量被使用时才会执行父类的<clinit>方法。实现类初始化时也不一定会执行接口中的<clinit>方法。
虚拟机会保证在多线程的环境中,一个类的<clinit>方法被正确的加锁、同步,只会有一个线程去初始化一个累,因此只有一个线程会执行这个类的<clinit>方法,其他线程阻塞等待。
我们在来看看<init>这个方法:
<init>方法是在一个类进行对象实例化时调用的。实例化一个类有四种途径:调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。
Java编译器会为它的每一个类都至少生成一个实例初始化方法。在Class文件中,被称为"<init>"
<clinit>是用于初始化静态的类变量, <init>是初始化实例变量!
- <init>与<clinit>的区别
- <init>与<clinit>的区别
- <init>与<clinit>的区别
- <init>与<clinit>的区别
- <init>与<clinit>的区别
- <init>和<clinit>的区别
- smail语法 <clinit>和<init>的区别
- <init>与<clinit>的区别 http://blog.csdn.net/sunmenggmail/article/details/10211395
- java中init()和clinit()方法的区别
- JVM Knowledges-类的 <clinit> 与 对象的<init> 对比
- <init>与<clinit>的区别 - 挨踢大杂烩 - 博客频道 - CSDN.NET http://blog.csdn.net/jamse19860909/article/details/7210
- onEnter与init的区别
- 深入理解jvm--Java中init和clinit区别完全解析
- 从类文件分析Java类装载过程<clinit>方法的调用和<init>的调用
- 关于servlet init parameters 与 context init parameters的区别
- git init 与 git init --bare 的区别
- git init 与 git init --bare 的区别
- linux etc/init 与etc/init.d的区别
- 使用gdb调试正在运行的程序
- 同步器
- Android Otto框架浅析
- js获取flash的宽高
- Android 多线程-----AsyncTask详解
- <init>与<clinit>的区别
- 数据分析师的知识结构
- 关于android性能,内存优化
- 自学it网
- CSS 的优先级机制[总结]
- DWORD-aligned
- java | & 运算
- Torque(2.4.6)+maui(3.3.1)下对用户配置节点的办法
- 字符串的全排列和全组合算法