JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
来源:互联网 发布:ido视频软件 下载 编辑:程序博客网 时间:2024/06/06 02:50
废话不多说 看看这段代码。告诉我结果:
import java.io.*;class Test { public static Test t = new Test(); public Test(){ a++; b++; } public static int a; public static int b = 0; public static void main (String[] args) throws java.lang.Exception{ System.out.println(t.a + " " + t.b);}}
如果你毫无疑问的答很简单 static 是类所有的,每个实例改变都会变他的值,答案是 1,1 那么。。恭喜你上套了。
你可以亲自试一下结果。 是1,0 这是为什么呢。 原来一个类加载的时候会经历以下步骤:
加载:查找并加载类的二进制数据
连接
-验证:确保被加载的类的正确性 //为什么会检验? 因为.class有可能是手动改的
-准备:为类的静态变量分配内存,并将其初始值转化为默认值
-解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值
回过头再来看最上面的一段程序。发现实例是在static成员上面写的,也就是在赋值之前。
那么在准备阶段, 会为静态变量分配内存,初始值为默认值,这时候 a 和b 都是 0,0 然后创建实例 a++;b++; 此时 a 和b的值都是1;
重点来了。接下来到了初始化过程, 会为静态变量赋予正确的初始值, 由于a没有赋值,所以还为1没有变化,但是b被赋予正确的初始值0。
所以这下真相大白了。 b的真实变化过程是 0-->1-->0。
附上一些笔记:
类的主动使用
1.创建类的实例
2.访问静态变量
3.调用静态方法
4.反射
5.初始化一个类的子类
6.虚拟机启动时候被标明启动类的类
将二进制读入到内存中 放在运行时的方法去内 堆內创建一个Class对象,用来封装类在方法区内的数据结构
加载class的方式
1.从本地系统直接加载
2.网络加载
3.zip jar包加载
4.从专有数据库提取.class
5,将java 源文件动态编译为.class
1 0
- JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
- 从一段奇怪代码开始说
- 一段学习反射的代码
- 值得学习的一段代码
- 一段学习CSS的代码
- 从一段Deferred代码片段想到的
- 在JVM退出的时候,执行一段特定的代码。
- 从0开始写代码--笔记
- 用一段简单代码看JVM的执行过程
- 一段高质量的SQL从问问题开始(笔记)
- 【Python笔记】从一段Bug代码来理解Python的Naming Rule
- 一段比较经典的多线程学习代码
- 一段比较经典的多线程学习代码
- 一段比较经典的多线程学习代码
- 一段比较经典的多线程学习代码
- 一段代码的学习--闭包
- 深度学习——从代码开始
- 一段不可思议的代码
- 数组
- linux脚本 awk命令详解
- 修改Eclipse格式化代默认长度
- Oracle 关于null的函数
- 命令行编译Android项目的工具类
- JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
- unity 在菜单中添加 复制文件菜单项(简易版)
- 理解MySQL——索引
- SQLServer :判断是否启用即时文件初始化
- 前后端接口分离-wiremock
- Android通知之Notification的多种用法
- Eclipse中如何添加Junit jar包
- 关于重入函数的资料总结
- redis复制