class Test{
private static void setString(String str1)
{
str1="a";}
public static void main(String[] s){ String strtest=new String("abc"); setString(strtest);
System.out.println(strtest);}
}为什么输入是a
本来我一直以为输出应该是abc的,因为string是一类,当作为参数传递时应该是传递的是引用,可是为什么这个string如此特殊!
我现在把string理解为一个基本类型,所以输出是a
一个特殊的类!!
结果是abc
但是我本来觉得是a的有谁能解释一下为什么呢?
private static void setString(String str1)
{
str1="a";}
public static void main(String[] s){ String strtest=new String("abc"); setString(strtest);
System.out.println(strtest);}
}为什么输入是abc
本来我一直以为输出应该是a的,因为string是一类,当作为参数传递时应该是传递的是引用,可是为什么这个string如此特殊!
我现在把string理解为一个基本类型,所以输出是abc
一个特殊的类!!
不过如果搂主对C比较收悉的话,我用更通俗的说法来解释下:我们将java中的对象变量都当作C中的指针来看待(其实java中也是这样实现的)strtest 就是一指向 字符串"abc" 的指针。
setString(strtest) 则将strtest 传递给形参指针strl,这时strl也指向了"abc",而 strl = "a"将strl指向了字符串"a"。
setString(strtest) 执行完后,strtest仍没有变化。重点是:函数setString(strtest),只是将strtest的地址传递给 strl,让strl也指向同样的对象。
要想真正改变strtest的状态,则改变strl所指向的对象的内容,而不是改变strl 所指向的地址
欢迎加入JAVA群:11131482
要求:至少工作一年
strtest 就是一指向 字符串"abc" 的指针.看这一句下面就知道了。。
(C不熟的就不提了)
strtest传递到setString中后和str1指向的是同一个地址,也就是
strtest---|
---abc
str1------|
但是现在改变str1的话,相当于str1产生了一个新的string对象,使str1指向a的(因为string是一个常量),但是strtest还是指向abc
java中所有的对象都是用类似指针的变量方式来实现,
所以重要的不是改变变量本身,而是改变变量所指向的对象。
简单的实现方式是把这个对象变成对象的属性,这样就没有什么问题了。
另外,在java中,String对象一但产生后都是常量,是不能在改变值的。
像
String a = "abc";
a = "xy";
这样只是改变了引用a的值从"abc"到"xy",内存中"abc"的值没有改变。
直到没有对"abc"的引用后,java垃圾处理掉"abc",内存释放才可在用,但这些不需要我们去做了。
StringBuffer sb = new StringBuffer("abc");
如果调用function
void fn(StringBuffer sb){
sb.append("xy");
}
则,sb就会变成"abcxy",调用 StirngBuffer 的其它方法也会发生改变。
StirngBuffer是实际的处理了它所指的内存缓冲区。
但如果function改为:
void fn(StringBuffer sb){
sb = new StringBuffer("mm");
sb.append("xy");
}
在此之后
System.out.print(sb.toString());
会发现结果:"abc"
问题在于,外面的sb和fn里面的sb并不是同一个东东,可看成sb1和sb2,但刚进fn时指向同一个内容,后来sb2指向了个新的内容,而sb1还是指向原来的"abc",所以不会变。
String对象和它道理相似,进入函数后,它只能改变“指向”,不能改变原来的内容,所以外面的String 不会改变。
str1 = "a";
str1 = new String("a");
这两个家伙等价!!!
然后String中没有函数
可以改变他自己的值!!!
如:
String str = new String(" I love Java!!! ");
str = str.trim();
str 的值是"a"
stringstr的值是"abc"
又没有出现赋值,怎么会乱使用对象的空间呢?
注意str = "a" 只对str这个变量起作用,对别的不起作用,而你在方法里定义的赋值相当于初始化
private static void setString(String str1)
{
str1="a";}
public static void main(String[] s){ String strtest=new String("abc"); setString(strtest);
System.out.println(strtest);}
}
哈哈,有那么复杂吗????
private static void setString(String str1)
{
str1="a";}
str1出了方法就离开有效域了,又没return,当然是"abc"
我没有学过C 直接学的JAVA。我刚开始学,还没学到String。但我的理解是。
str1="a"
strtest="abc"
两个不同的对象,如此而已。
要输出的是strtest
而setString()这个方法创建的是strl这个对象并给他赋值a
看下面的例子:
#include<stdio.h>void change(int *a){
*a=3;
}
void main ()
{int y, *x;
y=5;
x=&y;
change(x);printf("%d",*x);输出的是3,而不是5
private static void setString(StringBuffer str1)
{
str1.append("good");}
public static void main(String[] s){ StringBuffer strtest=new StringBuffer("abc"); setString(strtest);
System.out.println(strtest);}
}
看看<<thinking in java>>
就知道了