Java字节码
public static void main(String[] args) {
int i = 0;
i = i++;
int j = i++;
int k = i + ++i * i++;
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}
0 iconst_0 #常量0
1 istore_1 #0存入到变量i中,这两行对应int i = 0;
2 iload_1 #把i的值压入操作数栈
3 iinc 1 by 1 #i自增
6 istore_1 #i
7 iload_1 #i压栈
8 iinc 1 by 1 #i自增
11 istore_2 #
12 iload_1 #i压栈
13 iinc 1 by 1 #i自增
16 iload_1 #i压栈
17 iload_1 #i压栈
18 iinc 1 by 1 #i自增
21 imul
22 iadd
23 istore_3
24 getstatic #2
27 new #3
30 dup
31 invokespecial #4 >
34 ldc #5
36 invokevirtual #6
39 iload_1
40 invokevirtual #7
43 invokevirtual #8
46 invokevirtual #9
49 getstatic #2
52 new #3
55 dup
56 invokespecial #4 >
59 ldc #10
61 invokevirtual #6
64 iload_2
65 invokevirtual #7
68 invokevirtual #8
71 invokevirtual #9
74 getstatic #2
77 new #3
80 dup
81 invokespecial #4 >
84 ldc #11
86 invokevirtual #6
89 iload_3
90 invokevirtual #7
93 invokevirtual #8
96 invokevirtual #9
99 return
小结:
- 赋值
=, 最后计算=右边的从左到右加载值一次压入操作数栈- 实际先算哪个,看运算符优先级
- 自增,自减操作都是直接修改变量的值,不经过操作数栈
- 最后的赋值之前,临时结果都是储存在操作数栈中
单例设计模式
某个类在整个系统中只能有一个实例对象可以被获取和使用,
唯一
只能有一个实例
操作者不能随意创建, 所以
构造器必须私有化必须是自行创建
含有一个该类的
静态变量来保存这个唯一的实例必须自行向整个系统提供这个实例
对外提供获取该实例对象的方式
- 直接暴露
- 用静态变量的get方法
饿汉式
直接创建对象,不存在线程安全的问题
- 直接实例化饿汉式(简洁直观)
- 枚举式(最简洁)
- 静态代码块饿汉式(适合复杂实例化)
懒汉式
只有需要使用的时候才创建, 多线程需要考虑线程安全的影响
- 线程不安全(适合单线程)
- 线程安全(适合多线程)
- 静态内部类形式(适用多线程)