java方法中参数是对象时,是值传还是引用传,这个程序让我很难明白
class Test{
void test(String a)
{
a+="test";
}
void test1(Collection a){
a.add("test");
}
public static void main(String[] args){
String x="A";
Collection y=new ArrayList();
test(x);
test1(y);
System.out.println(x);
System.out.println(y);
}
运行结果是A
test
也就是说参数是String型时不管你在方法怎么操作,最后原来的值不变,而如果是其它类型,如ArrayList就变化了,这是为什么?
}
问题点数:20、回复次数:16Top
1 楼wearetheone(beehead)回复于 2005-06-03 09:18:00 得分 0
同问,帮顶
Top
2 楼wearetheone(beehead)回复于 2005-06-03 09:21:01 得分 0
首先说说自己的意见,类类型是使用引用的,这个变化就很肯定了,至于String原来的值不变,我是知道的,不过String也是一个类类型吧(好像是比较特殊的),具体希望高手分析一下Top
3 楼jihanzhong(逍遥)回复于 2005-06-03 09:24:52 得分 0
String是相当特殊的类!
你可以用StringBuffer看看。
记住一句话:String不停的创建对象,StringBuffer不停的改变对象Top
4 楼Maple99(Maple)回复于 2005-06-03 09:27:06 得分 0
JAV方法中参数,如果传递的是对象的话,其传递的是
对象的句柄,也就是安全类型的指针,当然你对指针操作也就是间接的对对象操作,但是对传入的参数,也就是句柄而言仍然是值传递,个人理解,有错的地方还请指出。另STRING类型是一个中特殊类型
其==和EQUAL的意思大致相同Top
5 楼wearetheone(beehead)回复于 2005-06-03 09:30:24 得分 10
关于string是值类型还是引用类型 当然了,string本质上肯定是引用类型,但是这个特殊的类却表现出值类型的特点:
判断相等性时,是按照内容来判断的,而不是地址
它肯定是一个引用类型没错,两个方面来看:
1. class string继承自object,而不是System.ValueType(Int32这样的则是继承于System.ValueType)
2. string本质上是个char[],而Array是引用类型,并且初始化时也是在托管堆分配内存的
string类型的另外一个特殊性在于它是“不会变”的,每次操作string,都相当于新建了一个string对象,所以对于string来讲,void Test(String s)和void Test(ref String s)永远都是不一样的。在这里string再次表现出了值类型的特点,我们以为这是传值 - 实际上传送的还是地址,但是在操作的时候string被再次初始化,外部根本不能得到这个变化。
还有,一般String被称为是简单类型,简单类型为传值,其他类型为传引用,这样就好解析了Top
6 楼dreamno(我命不由天)回复于 2005-06-03 09:33:54 得分 0
当你经过+运算后。a指向的已经不是“A“这块内存了。Top
7 楼ses127127(ses)回复于 2005-06-03 09:41:51 得分 0
Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
Top
8 楼ghostsG(GCool)回复于 2005-06-03 09:46:07 得分 0
String是不停的构建新的对象。Top
9 楼imliyf(dd)回复于 2005-06-03 10:13:46 得分 0
同意,jihanzhong(逍遥),顶Top
10 楼jeaking(空空)回复于 2005-06-03 10:27:50 得分 0
String s = "aaa";
s += "bbb";
//////////////////////
这两行代码涉及到3个对象,一个是"aaa", 一个是"bbb",还有一个是这两个对象相加得到的结果。
s +="bbb"的意思并不是说把"bbb"加到原来对象的后面,而是两个对象相加生成一个新的对象。s已经指向新的对象了。Top
11 楼gks_cn(981530)回复于 2005-06-09 19:54:29 得分 0
你看看java模式的深复制和浅复制,上面讲得多。Top
12 楼zzack(zack)回复于 2005-06-10 09:38:00 得分 0
java中所有的传递方法都是传值,不过由于对于对象的传递都是传递的对象的地址,所以也变成了传址Top
13 楼Runningboy007(菜鸟)回复于 2005-06-13 16:19:16 得分 0
学习中Top
14 楼totyulvxl(sun)回复于 2005-06-13 17:20:26 得分 0
upTop
15 楼pope_tju(飞刀小虫)回复于 2005-06-13 19:25:08 得分 0
对于基本类型pass by value 传递某个对象时是pass by reference
而String是一个唯读类进行a+="test"是创建了一个新的对象指向a+test而a依然还是原来的对象。
ps:楼主可以参看Thinking in java中的附录ATop
16 楼wangsheng1028(java菜)回复于 2005-06-13 20:09:41 得分 10
首先说说自己的意见,类类型是使用引用的,这个变化就很肯定了。
String为不可变对象,看看jdk对于string的描述就知道了
Strings are constant; their values cannot be changed after they are created.
地址不变内容肯定不变。Top




