扩展
之前逛知乎看【java是值传递还是引用传递】帖子时看到这个问题
Integer[] test={1,2};
Integer a=test[1];
test[1]= null;
System.out.println(a);
Integer类是引用类型,按照你所说的,最后输出应该为null,但事实上a还是2;
开始时我也懵了,因为我脑子里的画面是这样的:
但实际上经过思考后,其实是这样的:
这就是为什么a还是2的原因。
结论 : 赋null值不是在原来的内存地址上将内存清除,而是指向null。 这也对应了赋null值不会将垃圾清除,而是让对象的引用断开,使得gc垃圾回收器能够将对象清除。
面试题
public static void main(String[] args) throws Exception {
String s = "main";
fun(s);
System.out.println(s);
}
public static void fun(String s) {
s = "fun";
}
// 最终输出为”main"
直接图解:
fun方法执行前,形参s先被赋值指向了“main”
而 s = “fun” 方法实际上则是将s指向了一个新的对象(准确的说是放在字符串常量池中,因为"fun"是一个字面量),而不是在原内存地址上重新覆盖修改。
最后fun方法结束