李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习(五)--类加载器准备阶段和初始化阶段的重要意义分析
Leefs
2019-11-15 AM
4257℃
2条
# 类加载器准备阶段和初始化阶段的重要意义分析 ### 前言 本篇将通过一个代码示例和对示例进行演变,来探讨一下类加载器准备阶段和初始化阶段的重要意义。 **代码1** ```java public class MyTest6 { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); System.out.println("counter1:"+Singleton.counter1); System.out.println("counter1:"+Singleton.counter2); } } class Singleton{ public static int counter1=1; public static int counter2 = 0; private static Singleton singleton = new Singleton(); private Singleton(){ counter1++; counter2++; } public static Singleton getInstance(){ return singleton;//返回singleton实例 } } ``` > 输出结果 ```java counter1:2 counter1:1 ``` > 代码执行步骤 1. 1.执行`Singleton.getInstance()`,调用Singleton类中的`getInstance()`方法,执行singleton实例。 2. 2.执行`private static Singleton singleton = new Singleton();`创建Singleton对象,在此之前分别给`counter1`和`counter2`赋初值。 3. 3.执行通过singleton创建对象执行私有化构造器`Singleton()`,执行`counter1++`,`counter2++`. 4. 4.返回`getInstance()`方法的实例。 5. 5.向下执行,输出`Singleton.counter1`和`Singleton.counter2`。 大家可以通过断点进行调试一下,把整个执行过程走一遍。 **代码2** ```java public class MyTest6 { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); System.out.println("counter1:"+Singleton.counter1); System.out.println("counter1:"+Singleton.counter2); } } class Singleton{ public static int counter1=1; private static Singleton singleton = new Singleton(); private Singleton(){ counter1++; counter2++;//准备阶段的重要意义 } public static int counter2 = 0; public static Singleton getInstance(){ return singleton;//返回singleton实例 } } ``` > 输出结果 ```java counter1:2 counter1:0 ``` **代码2**是将**代码1**中的`counter2`移到**Singleton()**私有构造器下面。 调用`Singleton`类的静态方法`getInstance()`相当于是对Singleton类的主动使用,在类加载的准备阶段,通过从上而下一次执行对Singleton中的参数进行赋初值。 **准备阶段执行过程:** + 1.`counter1`默认值为零 + 2.singleton默认值为null + 3.Singleton()私有化构造器不会执行 + 4.`counter2`默认值为零 **代码初始化阶段** + 1.`counter1`赋值为1 + 2.创建Singleton私有化对象 + 3.执行Singleton()私有化构造器 + 4.`counter1++` + 5.`counter2++` + 6.将`counter2`赋值为0 **准备阶段的重要意义:**当没有准备阶段时直接进行初始化,造成在执行Singleton()私有构造器时counter2没有默认值会直接报错,程序执行不下去。所以,准备阶段对于代码的执行过程是必不可少的。
标签:
Java
,
JVM
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/176.html
上一篇
Jquery完成省市联动
下一篇
JVM学习(六)--类加载器深入解析及重要特性剖析
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
人工智能
SpringBoot
Spark RDD
Kafka
MyBatisX
线程池
Spark Streaming
Elastisearch
Shiro
Flume
Spark
MyBatis
链表
Java阻塞队列
pytorch
队列
递归
Docker
正则表达式
CentOS
工具
Golang
JVM
ajax
Zookeeper
查找
Hadoop
稀疏数组
设计模式
GET和POST
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭