站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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);

}
}


↑返回目录
前一篇: 为什么这样写,运行不了,在线等.谢谢各位
后一篇: 请教一个继承Enum的问题