一个看起来比较简单的问题,会有一个意想不到的结果--------两个变量的比较。
class Class1 {
String Var1 =new String("2222");
void Mod1()
{
String Var1 = new String("2222");
//Var1 = "2222";
//this.Var1 = "2222";
if(Var1 == this.Var1)
{
System.out.println("true");
}
else
{
System.out.println("false");
}
}
public static void main(String[] args) {
// TODO 自动生成方法存根
Class1 class1 = new Class1();
class1.Mod1();
}
}
这段代码的执行结果是输出:false 。而将代码中的
//Var1 = "2222";
//this.Var1 = "2222";
这两行的注释符去掉,则执行结果是输出:true 。
那位给咱讲讲。
问题点数:20、回复次数:4Top
1 楼leafxx(因为音乐,所以自由)回复于 2006-07-04 16:50:15 得分 5
有很多基本概念要搞清楚
Mode1里的var是局部变量,而this.var引用的是域变量
String是final的非可变对象,如果字符串相同的话,多个String引用会共享同一个对象
而你的代码中String Var1 = new String("222");
在Mod1里String Var1 = new String("222"); 在内存中又new了一个222的字符串对象出来,虽然完全一样,但却是两个不同的对象
应该写成String var1 = "222",不需要加上new,这样var在编译期就会共享同样的字符串
还有比较字符串应该使用equals而不是==,==只能比较是否是同样的引用Top
2 楼kevinliuu()回复于 2006-07-04 16:50:27 得分 5
就是这样的
首先 == 比较的是不是内容,比较的是句柄是否指向同一地址
第一种情况下,this.Var1指向的是成员变量的地址,而Mod1中的Var1是一个new出来的局部变量地址肯定不相同,因此为fasle
第二种情况,Var1 = "2222"; this.Var1 = "2222"; 实际上是指向了同一地址,也就是说第二种情况实际上堆中只有一个"2222"的字符串,局部变量Var1和成员Var1都指向它,而第一种情况,堆中有两块内容,也就是有两个"2222"的字符串空间
Top
3 楼leafxx(因为音乐,所以自由)回复于 2006-07-04 16:51:33 得分 5
更正:第三行,String是非可变类(final class)Top
4 楼navence(卡西C)回复于 2006-07-04 16:51:59 得分 5
因为new String了,所以全局变量Var1 不等于局部变量Var1
这两行的注释符去掉后,全局变量Var1和局部变量Var1 指向同一地址
所以全局变量Var1 等于局部变量Var1
Top




