当前页面: 开发资料首页 → J2SE 专题 → 类的按值传递和句柄引用(String类的疑惑)?????????????
类的按值传递和句柄引用(String类的疑惑)?????????????
摘要: 类的按值传递和句柄引用(String类的疑惑)?????????????
class Cat
{
int a;
String s;
public Cat()
{
this.a=1;
this.s="aaa";
}
}
public class StringTest
{
public static void change(Cat cat)
{
cat.a=9;
cat.s="ggg";
}
public static void main(String args[])
{
Cat cat1=new Cat();
change(cat1); //这里的对象经过change函数的“句柄引用”后已经改变了
System.out.println(cat1.a); //打印9
System.out.println(cat1.s); //打印ggg
}
}
按照书上说的:任何对象(非基础类型)的传递都是按“句柄引用”(类似指针)
可是为什么String类不按这条定律规定的,String也是非基础类型啊,他为什么比较特别??
================================================================
public class StringTest
{
public static void change(String str)
{
str="bbb";
}
public static void main(String args[])
{
String a="aaa";
change(a); //这里的对象经过change函数的“句柄引用”后却没有改变,要是按上面一段代码那样,他应该改变的才对啊,为什么呢??????
System.out.println(a);//打印出来还是"aaa"
}
}
为什么要用public static void change(String str) static 来修饰这个方法呢?
问题就在这里
不好意思,看错了,用STATIC对着呢.
这个合理的解释,我认为应该是这,直接String a="aa";是在堆栈内的a指向一个叫做字符串池里面的aa,这个问题的答案就是,在池里面不是句柄引用,而是值传递.
简单的说就是,你如果要比较两个字符串:
1,String a="aaa";
String b="aaa";
if(a==b){
System.out.println("true");
}else{
System.out.println("false");
} 结果是true
2,
String a=new String("aaa");
String b=new String("aaa");
if(a==b){
System.out.println("true");
}else{
System.out.println("false");
} 结果是false
这个就是关于字符串对象放在那里的问题,1是在池里面,按照值比较,2是在堆里面,按照地址比较.
public class HelloWorld
{
public static void change(String str)
{
str="bbb";
}
public static void main(String args[])
{
String a=new String(); //按楼上说的,这下a是在heap里了吧,可是。。
a="aaa";
change(a);
System.out.println(a);//打印出来还是"aaa"
}
}
换成下面这个试试:
package test;
public class HelloWorld
{
public static String change(String str)
{
str="bbb";
return str;
}
public static void main(String args[])
{
String a=new String();
a="aaa";
a = change(a);
System.out.println(a);
}
}
打印出来肯定是:bbb
如果LZ还看不明白的话,再问.建议先自己对照看自己的问题出在哪里了,那样你的记忆才会深刻!
不知道这么解释楼主能看明白吗?
public class StringTest {
public static void change(String str) { //此处 str 和 a 两个String 对象引用均 //指向 "aaa";
str = "bbb"; //此处 str 被赋值重新指向另外一个字符串对象 "bbb"
} // 而 a 没有变化
public static void main(String args[]) {
String a = "aaa";
change(a);
System.out.println(a);
}
}