那如果我把final int a=8;替换成:final String a="fafa"; 那么当我调用完f() 后,String a会被垃圾回收马??
也会被释放的,String a="fafa";这种字符串放在字符串常量区,String b = new String("fafa");这种字符串放在堆里。这是两种不同的对象。
java的变量是传值的,只有对象才是传地址。 这样理解,就清楚了。
我想final的作用不仅仅是使它成为常量。他还有别的作用。 大家看看这段代码: 注意变量s是定义在方法内部的局部变量。 class D { public void g(){}; } class A { public D f() { final String s="fafa"; class B extends D { public void g() { //error: s must be final System.out.println(s); } } return new B(); } } public class Test { public static void main(String [] args) { A a=new A(); D d=a.f(); d.g(); d.g();//调用两次,没有问题。那就说明s不能在第一次调用完就 失效,我想这个效果是和final修饰有关系的。 } }
那么当我调用完f() 后,String a会被垃圾回收马??
这样理解,就清楚了。
大家看看这段代码:
注意变量s是定义在方法内部的局部变量。
class D
{
public void g(){};
}
class A
{
public D f()
{
final String s="fafa";
class B extends D
{
public void g()
{
//error: s must be final
System.out.println(s);
}
}
return new B(); }
}
public class Test
{
public static void main(String [] args)
{
A a=new A();
D d=a.f();
d.g();
d.g();//调用两次,没有问题。那就说明s不能在第一次调用完就
失效,我想这个效果是和final修饰有关系的。
}
}