本java程序共创建了3个String(针对String的分析,实际上更多),一个是hello,一个是world,一个是bye。在程序运行过程中,3个Sting所在内存的地址被依次赋给了d1对象的temp属性。而String类的数据在内存中不可变,指的是String一旦创建,将不会变化,比如本例中的hello,创建后所在内存保存到temp变量中,后来temp变量指向的内存地址变为world所在的内存地址。而原来hello的内容并没有变化,只是它的内存地址被丢弃了而已。在将来的java的垃圾回收中或者程序结束后,该内存空间就会被重新分配给其他对象或者程序使用。
数据的存储区,分为堆内存、栈内存和常量存储区,其中,堆内存用来存放数组和对象,通过new建立的实例对象都存放在堆内存中,堆中的实体都有内存地址值,实体中的变量都有默认初始值,实体不再被使用时,会在不确定的时间呗垃圾回收机制回收。而栈内存用来存放局部变量,当数据使用完后,所占空间会自动释放。字符串常量存放在常量存储区的,所以不可以被改变。