两个引用指向同一对象
相关代码:
运行截图:
代码在内存中的执行步骤和对象内存图-1,-2大致相同
重点代码解释:
12行代码:s1的地址给了s2(即两个变量指向同一块地址)
13行代码:s2.name= “李四”。将原本地址存储的张三覆盖改为了李四
14行代码:打印s1.name和s2.name
15行代码:s1=null; 此时栈内存中的变量s1与堆内存中的地址连接切断,即s1找不到在堆内存中的地址了。
16行代码:打印将会输出异常“NullPointerException”
17行代码:打印s2.name,因为s2在12行中让栈内存中变量s2指向了堆内存中的地址,所以道理上应该打印:李四。但在代码运行中遇到前面16行异常就退出运行
18行代码:s2=null; s2也找不到在堆内存中的地址了
这时堆内存中开辟的空间没有变量能找到,没有人使用成员变量了,那么堆内存中开辟的空间就成了垃圾,将会被java机制清理
JAVA垃圾回收机制:
当堆内存中,对象和数组产生的地址,通过任何方式都不能被找到后,就判定为内存中的垃圾,垃圾会被java垃圾回收器在空闲的时候自动进行清理。