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

本文共 1708 字,大约阅读时间需要 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

 

转载于:https://www.cnblogs.com/softidea/p/4556402.html

你可能感兴趣的文章
学习这门课的一些问题
查看>>
TD Rigging Demo Reel 性感美女绑定展示
查看>>
本地主机不安装oracle客户端--访问远程oracle数据库
查看>>
[c++]常对象的特点
查看>>
Django之组合搜索组件(二)--另附simple_tag的创建使用方法
查看>>
webpack打包The 'mode' option has not been set,错误提示
查看>>
kermit的安装、配置、使用
查看>>
jQuery 的attr()与css()的区别
查看>>
程序员面试宝典纠错,取反操作的优先级高于移位,而非移位的优先级高于取反,整型提升蒙蔽了真相...
查看>>
Python中的对象引用、浅拷贝与深拷贝
查看>>
验证对Random的两个猜想
查看>>
打包压缩基础
查看>>
技术点链接
查看>>
【转】ArrayList的toArray,也就是list.toArray[new String[list.size()]];,即List转为数组
查看>>
正则表达式整理
查看>>
OpenStack Keystone架构
查看>>
mysql常用命令
查看>>
Hadoop - WordCount代码示例
查看>>
STL阶段练习(简单电话簿功能模仿)
查看>>
原创《分享(Angular 和 Vue)按需加载的项目实践优化方案》
查看>>