package cn.test;class Test { public static void main(String[] args)
{
Change chge = new Change();
String[] str = {new String("hello"),new String("world")};
String str1 = new String("hello"); chge.change(str,str1);
System.out.println(str[0]);
System.out.println(str1);
}
}
class Change
{
public static void change(String[] str2,String a)
{
str2[0] = new String("change");
a="change"; }
}
为什么string 和 string 数组机制不一样呢
{
Change chge = new Change();
String[] str = {new String("hello"),new String("world")};
String str1 = new String("hello"); chge.change(str,str1);
System.out.println(str[0]);
System.out.println(str1);
}
}
class Change
{
public static void change(String[] str2,String a)
{
str2[0] = new String("change");
a="change"; }
}
为什么string 和 string 数组机制不一样呢
楼主【dutysmart】截止到2008-07-19 23:42:16的历史汇总数据(不包括此帖):
发帖的总数量:17 发帖的总分数:600 每贴平均分数:35
回帖的总数量:9 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:1 结贴的总分数:20
无满意结贴数:0 无满意结贴分:0
未结的帖子数:16 未结的总分数:580
结贴的百分比:5.88 % 结分的百分比:3.33 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
{
Change chge = new Change();
String[] str = {new String("hello"),new String("world")};
String str1 = new String("hello"); chge.change(str,str1);
System.out.println(str[0]);
System.out.println(str[1]);
System.out.println(str1);
}
}
class Change
{
public static void change(String[] str2,String a)
{
str2[0] = new String("change");
str2[1] = "change";
a="change";
}
}
{
str2[0] = new String("change");a="change";}
对于数组,你修改的是str2指向的数组对象中的数据,所以起作用。
对于String,你修改的是a,让a指向了一个新的对象,外面的对象不受影响。
String str1 = new String("hello"); chge.change(str,str1);
看方法里面,
public static void change(String[] str2,String a)
{
str2[0] = new String("change");str2[1] = "change";a="change";
}
调用的时候,str2是str的一份复制,所以str2和str指向同一个对象。a是str1的一份复制,所以a和str1也指向同一个对象。
str2[0] = new String("change");//修改了str2指向的数组对象的第一个元素,因为str2和str指向同一个对象,所以函数指向完后,str指向的对象得到了修改。a="change";//你让a指向了一个新的对象,str1仍然指向”hello“,没有收到影响。
方法执行完的时候a和str2已经不存在了,如果他们修改了外面的对象,那么外面能看到作用,如果他们修改了
str2和a的本身,也就是说对这两个变量执行了赋值操作,外面不受影响。
{
str2={new String("test1"),new String("test2")}; //修改了str2本身,而不是修改它指向的对象
a="change";
} 这样修改一下,你再看看就明白了。
注意
String str= new String("abc");
str只是指向该对象的应用,它可以指向其他的String对象
String[] str = {new String("hello"),new String("world")};
str[0]和str[1]是两个引用,同样可以改变他们引用的值
str[0]=new String("test");
str[1]=new String("test2");
public static void main(String[] args) {
StringBuilder builder=new StringBuilder("hello");//builder指向的对象的内容是hello
System.out.println(builder);
builder.append(" world"); //修改了上面创建的对象的内容,现在内容是 "hello world"
System.out.println(builder);
builder=new StringBuilder("test");//builder指向了新的对象,它的内容是test.原来的内容为//”hello world"的对象依然存在于堆内存中,但是我们没有办法访问到了,java虚拟机会在适当的时候回收内存
}
}
请问 为什么不受影响呢
str[0]和str[1]是两个引用,同样可以改变他们引用的值 引用不是指向源对象吗? 引用的值应该就是对象的值呀
s = "xxx";
这两行却是合法的。为什么呢?因为"xxx"是一个新的对象,“abc”还在,只是没有人管他了。(貌似很可怜)s现在指向的是xxx。
a = "change"实际上不只a是一个新的引用.指向new String("change")的同样是一个新的引用. String对象是不会变的,变的是引用.而str2[]在这里.他就用str2[0]指向了这个新的引用.相当于:String xx = new String("change");str2[0] = xx;这样就比较明白了吧.xx和a都变了.不变的是String对象和str2[0].str2[0]进入了函数,把老的引用踢了,用了新的xx引用.所以等他回去的时候,xx引用的新对象"change"也一起回去了.留下了a和str2[0]的老引用在那里等待垃圾回收^_^
在这个change(String[] str2, String a)也是这样的。这里str2的值不是你认为的数组,而是它指向的数组的首地址。所以你执行str2[0] = a;就改变了数组的实际
内容。而方法外的str1还是指向这个数组的首地址,所以你看到str1这个数组的内容改变。String a的情况也是一样,就不重复了
class Change {
public static void change(String[] str2, String a) {
str2[0] = new String("change"); a = "change"; }
}这里的str2和a都是引用的一个拷贝
各自指向原来的对象
他们是都不能改变的
但是str2确实指向原来的对象
所以str2[0] = new String("change");这样的操作是没有任何问题的