博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java ClassLoader static
阅读量:6939 次
发布时间:2019-06-27

本文共 1656 字,大约阅读时间需要 5 分钟。

 

package init;class Person {    private static Person person = new Person();    public static int count2 = 5;    public static int count1;    private Person() {        count1++;        count2++;    }    public static Person getInstance()    {        return person;    }}public class Testsingleton {    public static void main(String[] args) {        System.out.println("count1: " + Person.count1);        System.out.println("count2: " + Person.count2);    }}

 

Output:
count1: 1
count2: 5
原因:
ClassLoader

类在执行之前会执行三个步骤:

1.类的加载:查找并加载类的二进制数据,把对应的class文件加载到内存

2.连接

     2.1. 验证:确保被加载的类的正确性(主要防止恶心的class文件被加载)

     2.2. 准备:为类的静态变量分配内存,并将其初始化为默认值

     2.3. 解析:把类中的符合引用转换为直接引用

3.初始化:为类的静态变量赋予正确的初始值

 

发现其中步骤2.2和3提到了关键字静态变量,重点关注这两步,2.2的结果会导致为静态变量

person,count1,count2分配内存并赋值(默认值)

person=null;

count1=count2=0

 

到步骤3,初始化时会为静态变量赋予正确的值,那么什么时候才会进行初始化呢?

     所有的java虚拟机实现必须在每一个类或接口被java程序“首次主动使用”时才初始化 

java对类的使用方式分为:主动使用,被动使用

主动使用有六种:(除这6种外,其他都是被动使用)

1、创建类的实例

2、访问某个类或接口的静态变量或对该静态变量赋值
3、调用类的静态方法
4、反射
5、初始化类的子类
6、java虚拟机启动时被标注位启动类的类
即在执行main方法时会为静态变量赋值,如果有多个静态变量,按照自上而下的顺序(编译器会优化,与代码书写的顺序会不一致)
为person变量初始化时后count1=1;count2=1;
public static int count2 = 5;执行后,count2=5
验证:

package init;class Person {    public static int count2 = 5;    private static Person person = new Person();    public static int count1;    private Person() {        count1++;        count2++;    }    public static Person getInstance()    {        return person;    }}public class Testsingleton {    public static void main(String[] args) {        System.out.println("count1: " + Person.count1);        System.out.println("count2: " + Person.count2);    }}

Output:

count1: 1
count2: 6

http://longpo.iteye.com/blog/2217113

 

转载地址:http://quinl.baihongyu.com/

你可能感兴趣的文章
《Cocos2d 跨平台游戏开发指南(第2版)》一1.8 让精灵动起来
查看>>
Python-高阶函数习题练习
查看>>
Redis开发运维实践Shell提权问题
查看>>
Copycat - StateMachine
查看>>
【软妹带你学技术】十一份Docker福利包疯狂砸来,看官们还请轻戳呦
查看>>
JTA 深度历险 - 原理与实现
查看>>
【Spark Summit EU 2016】TensorFrames: 在Spark上搭建TensorFlow深度学习框架
查看>>
RDS for MySQL 空间问题的原因和解决
查看>>
java 自适应响应式 SSM 生成静态化 手机 平板 PC 企业网站源码
查看>>
VGA练习之图像的动态显示(后续)
查看>>
开源组件photoView学习
查看>>
QT Creator 快捷键
查看>>
打开天窗说“亮话”,手淘这些年的技术大揭秘
查看>>
那些有坏味道的代码
查看>>
我们究竟什么时候可以使用Ehcache缓存
查看>>
不方便的事情,人们都不大会去做
查看>>
防火墙研究大进步,FTP服务器搭建……
查看>>
浮窗系列之越过授权使用浮窗
查看>>
aspx页面事件执行顺序(详细版)[转]
查看>>
开源项目AndroidReview学习小结(2)
查看>>