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

小结:

  1. 赋值=, 最后计算
  2. =右边的从左到右加载值一次压入操作数栈
  3. 实际先算哪个,看运算符优先级
  4. 自增,自减操作都是直接修改变量的值,不经过操作数栈
  5. 最后的赋值之前,临时结果都是储存在操作数栈中

单例设计模式

某个类在整个系统中只能有一个实例对象可以被获取和使用, 唯一

  • 只能有一个实例

    操作者不能随意创建, 所以构造器必须私有化

  • 必须是自行创建

    含有一个该类的静态变量来保存这个唯一的实例

  • 必须自行向整个系统提供这个实例

    对外提供获取该实例对象的方式

    1. 直接暴露
    2. 用静态变量的get方法

饿汉式

直接创建对象,不存在线程安全的问题

  • 直接实例化饿汉式(简洁直观)
  • 枚举式(最简洁)
  • 静态代码块饿汉式(适合复杂实例化)

懒汉式

只有需要使用的时候才创建, 多线程需要考虑线程安全的影响

  • 线程不安全(适合单线程)
  • 线程安全(适合多线程)
  • 静态内部类形式(适用多线程)

   转载规则


《》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
ServletContext对象 对象在工程部署时创建, 在web工程停止时销毁 一个web工程只有一个ServletContext对象实例 ServletContext对象和不同的Servlet类的关系类似全局变量和函数的感觉 GET
2023-02-04
下一篇 
微信小程序app.json框架–全局配置 pages中第一个代表默认打开的页面 window: tabBar 目录结构 目录名 作用 styles 存放公共样式 components 存放组件 lib 存放第三
2023-02-04
  目录