深入Java虚拟机(3)
来源:互联网 发布:苏联援华航空队 知乎 编辑:程序博客网 时间:2024/06/10 10:45
我们先看一段看起来很纠结的代码
package org.classloader;public class Singleton {private static Singleton singleton=new Singleton();public static int count1;public static int count2=0;public Singleton(){count1++;count2++;}public static Singleton getInstance(){return singleton;}public static void main(String args[]){Singleton singleton=Singleton.getInstance();System.out.println(singleton.count1);System.out.println(singleton.count2);}}
结果是 1 0 你分析正确了么,如果没有回顾一下,深入虚拟机(1)和(2)的内容
静态代码的执行是自上而下的先后顺序
1.类的初始化步骤
2.初始化时机
• 主动使用(六种)
– 创建类的实例
– 访问某个类或接口的静态变量,或者对该静态变量赋值
– 调用类的静态方法
– 反射(如Class.forName(“com.shengsiyuan.Test”))
– 创建类的实例
– 访问某个类或接口的静态变量,或者对该静态变量赋值
– 调用类的静态方法
– 反射(如Class.forName(“com.shengsiyuan.Test”))
– 初始化一个类的子类
– Java虚拟机启动时被标明为启动类的类(Java Test)
除了上述情况都不会导致类的初始化
只有当程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用【如果有继承关系,访问父类的静态方法不会是类的主动使用】
【编译时能确定的变量 static final 不会导致类的初始化】
public class Singeleton extends Singleton {public static void main(String args[]){System.out.println(aa.getInstance());}}class aa extends Singleton{static {System.out.println("22");}}
输出没有22 因为访问不是本类的静态变量
调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。
0 0
- 深入Java虚拟机(3)
- 深入理解Java虚拟机--读书笔记3/3
- 《深入学习java虚拟机》--笔记3
- 《深入理解Java虚拟机》读书笔记3
- 深入理解Java虚拟机--读书笔记1/3
- 深入理解Java虚拟机--读书笔记2/3
- 读深入理解Java虚拟机-3
- 《深入理解java虚拟机》-第3章
- 深入JAVA虚拟机 1
- Java虚拟机深入研究
- 深入java虚拟机
- Java虚拟机深入研究
- 深入java虚拟机读书笔记
- java 虚拟机深入研究
- 深入Java虚拟机
- 《深入java虚拟机》读书笔记
- 深入JAVA虚拟机
- java 虚拟机深入研究
- Java 正则表达式教程
- 异常介绍、自定义异常、异常面试题
- node.js学习笔记(1)---win7 64位MongoDB安装及使用及可视化工具使用
- 内存池中如何保存内存块大小信息
- google云端硬盘打不开的解决办法
- 深入Java虚拟机(3)
- 这里表及以下
- linux 页面回收和页交换
- 深入理解C++的动态绑定和静态绑定
- Android开发——EditText属性
- 家中各个连网设备的作用
- 字符,字节和编码
- 微软Microsoft Visual Studio 2013 社区巡讲武汉站
- 非递归前序遍历(非递归、非栈)