与的区别
程序员文章站
2022-03-05 16:01:00
...
今天在看深入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>"
现在知道了吧, 一个是用于初始化静态的类变量, 一个是初始化实例变量!
上一篇: 继承时候的初始化顺序
推荐阅读
-
观察者模式与发布订阅者模式的区别
-
JS中call与apply的作用及区别 jscallapply执行上下文
-
union与union all 的区别
-
oracle与sql 的区别(常用函数)_MySQL
-
jquery.extend 与 jquery.fn.extend的区别和使用
-
浅析PHP中的i++与++i的区别及效率,浅析php
-
解析mysql二进制日志处理事务与非事务性语句的区别_MySQL
-
php中session_unset与session_destroy的用法与区别
-
vue.extend与vue.component的区别和联系
-
WPF 中Binding的2个属性Source与ElementName的区别