③. 透过字节码指令看代码细节
- ①. Integer:透过字节码可以看出,当Integer的范围在-128 - +127 之间会在数组中直接拿取数值,超过这个范围会重新new对象
public class IntegerTest { public static void main(String[] args) { /* * 透过字节码可以看出,当Integer的范围在-128 - +127 之间会在数组中直接拿取数值 * 超过这个范围会重新new对象 * */ Integer x = 5; int y = 5; System.out.println(x == y); Integer i1 = 10; Integer i2 = 10; System.out.println(i1 == i2);//true Integer i3 = 128; Integer i4 = 128; System.out.println(i3 == i4);//false }
②. 在父类中调用方法,如果子类有重写,那么调用的是子类的方法,如代码中的this.print( )
注意:这里的this是指的 new son( )
/* 成员变量(非静态的)的赋值过程: ① 默认初始化 - ② 显式初始化 /代码块中初始化 - ③ 构造器中初始化 - ④ 有了对象之后,可以“对象.属性”或"对象.方法" 的方式对成员变量进行赋值。 */ class Father { int x = 10; public Father() { this.print(); x = 20; } public void print() { System.out.println("Father.x = " + x); } } class Son extends Father { int x = 30; // float x = 30.1F; public Son() { this.print(); x = 40; } public void print() { System.out.println("Son.x = " + x); } } public class SonTest { public static void main(String[] args) { Father f = new Son(); System.out.println(f.x);//编译看左边,执行也看左边 } } /* son.x=0 son.x=30 20 */
④. 如何解读供虚拟机解释执行的二进制字节码?
- ①. 一个一个二进制的看。这里用到的是Notepad++,需要安装一个HEX-Editor插件,或者使用Binary Viewer
- ②. 使用javap指令:jdk自带的反解析工具
- ③. 使用IDEA插件:jclasslib 或jclasslib bytecode viewer客户端工具(可视化更好)