public class demo{
public static void main(String[] args){
String x="hello";
change(x);
System.out.println(x);
}
static void change(String m){
m = m + 2;
}
}请问输出结果是什么?
为什么还是hello呢?
我知道String类型的对象是常量,知道当实参传递到change函数里会产生一个String对象引用的副本.
问题是:对象m会不会在常量存储区中再产生一个对象的副本.其实修改的是副本对象?
但是既然会产生String类型的副本对象,那么也应该是常量,那么连接数字2是不是会没有效果呢?
m = m + 2;
修改的是副本的对象值
应该这样
public class StringPrintTest
{
public static void main(String[] args){
String x="hello";
String y=new String("hello");
x=change(x);
y=change(y);
System.out.println(x);
System.out.println(y);
}
static String change(String m){
return m = m + 2;
}
}
你把String全部换成StringBuffer就知道了!
2. 你把change()方法设成有返回值,再试一下:
你调用了方法没返回啊 public class demo{
public static void main(String[] args){
String x="hello";
String s = change(x);
System.out.println(s);
}
static String change(String m){
return m = m + 2;
}
}
public static void main(String[] args){
String x="hello";
change(x);
System.out.println(x);
}
static void change(String m){
m = m + 2;
}
}
我的理解是change方法改变的是局部变量m的值,m在调用完这个方法以后,引用就失效了,所以X的值还是hello。
你加上return m 试试
m+2会产生一个新的String,然后m又指向这个新的String,就相当于m=new("hello2")
,此时的m已经不是x的副本了。
就好比一个(名字叫x)的人通过一条线拉着一个(名字叫hello)的气球,
然后通过x克隆一个叫m的人,m手上也拉着一条线指向(名字叫hello)的气球。 此时hello气球上有2条线。然后m这个人把他的这条线从hello气球上解下来,绑在了hello2气球上。现在问你x这个人的手里拉着那个气球, 那肯定是hello了
public static void main(String[] args){
String x="hello";
x=change(x);
System.out.println(x);
}
static String change(String m){
m = m + 2;
return m;
}
}
// TODO Auto-generated method stub
String x="hello";
x=change(x);
System.out.println(x);
}
static String change(String m){
m = m + 2;
return m;
}
楼主,请看这个应该可以明白了。
你是指这样?
public class Test {
public static void main(String[] args){
StringBuffer x= new StringBuffer("hello");
change(x);
System.out.println(x);
}
static void change(StringBuffer m){
m.append("2");
}
}
和String的特殊性没有任何关系,换任何对象和数值都会是这个结果.
是java的传参方式造成的( ̄(工) ̄) public class Demo
{
public static void main(String[] args)
{
String[] x = {"hello"};
change(x);
System.out.println(x[0]);
} static void change(String[] m)
{
m[0] = m[0] + 2;
}
}
hello2
我给你说明白一点:
main方法和chang方法在内存中有着各自的地址空间.
在main方法里面,x引用了(引用也就是C语言中的指针)字符串 "hello",当调用方法chang(x)时,x的引用传递给m(注意:在java语言里,参数传递都是值传递,x的引用传递给m,m又引用字符串"hello"),这时x和m的地址是是不同的,只是都引用了"hello".
在方法chang内部,m的地址已被改变,这时m引用其他的内容,但是x没有变化,还是引用"hello",所以程序的最后结果还是"hello"
{
/** Main方法 */
public static void main(String[] args)
{
String x = "hello";
System.out.println(x);
change(x);
System.out.println(x); /** 将下面chang方法的头标志进行修改,以便将m所引用的字符串打印出来 */
System.out.println(change(x));
}
/** chang方法 x的引用传递给m(并非将x所引用的字符串传递给m) */
public static String change(String m)
{
return m + 2; // m所指向的字符串变为"hello2",并且返回
}
}
return m + 2; // m所指向的字符串变为"hello2",并且返回 感觉这种说法有点问题。