你是按照语句执行顺序一步一步分析的,但实际情况是这样的:
1、Java源文件被编译器编译成class字节码文件,在编译的过程中,编译器把所遇到的常量都统一存储于字节码文件中的data段中;
2、程序执行时,字节码文件被加载到内存中,这时data段中的内容被加载到只能读不能写的内存区域,所以当字节码文件被解释执行时,肯定是能在这个区域中找到所有常量的。
总结:
String a = "a"; //将常量区的“a”的地址赋给 a
String a =“ab”; //将常量区的“ab”的地址赋给 a
String c ="a"; //将常量区的“a”的地址赋给 c
在张孝祥老师的视频中有讲到一个自动拆箱和自动装箱原理,对于在128到-127之间常用的integer封装对象,由于经常使用,java就赋予了一个自动转换功能,当需要和int类型的变量进行比较的时候,就会自动拆箱转换成int类型的局部变量,但是超出这个范围是不可以的,比如:
nt c = 200;
Integer d = new Integer(200);
System.out.println(c == d);//此时,打印为false。