java 引用传递

public static void main(String[] args) {
String str="111";
myTest(str);
System.out.println(str);
}
public static void myTest(String str){
str="22222222";
}
最后为啥输出111

因为字符串常量与一般对象不同,JVM(Java虚拟机)将字符串常量创建在一个Pool里面,所以"111"和“2222222”都在这个Pool里。main里面的str指向"111",而myTest里面的局部变量先指向"111",后指向"22222222",当myTest调用结束,该变量消亡,但main里面的str并未改变,仍然指向"111"。

如果是一般对象,不同在于一般对象存在于heap memory中,当调用myTest时,myTest中的局部变量也指向该对象,如果在myTest中修改对象中的某个instance variable的值,返回后,因为main里面的str指向heap中同一对象,自然该值也改变了。追问

谢谢,,,能写个用'一般对象'做参数的例子吗..

追答

mport java.util.Date;
class Test {
public static void main(String[] args) {
Date aDate = new Date(1000);
System.out.println(aDate); // 输出 Thu Jan 01 01:00:01 GMT 1970
myTest(aDate);
System.out.println(aDate); // 输出 Thu Jan 01 01:00:02 GMT 1970
}

public static void myTest(Date dateArg) {
dateArg.setTime(2000);
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-15
字符串与其它的类不一样,虚拟机会对它作处理,这个是值传递,不是引用传递。
第2个回答  2011-07-15
把myTest改成:public static void myTest( ref String str){
str="22222222";
}
如果没有ref,方法内对参数所做的更改无效
第3个回答  2011-07-15
String 是不可以重写的 也就是final
每次+操作都是新创建一个String

也就是说 main里的str与myTest中的str指向的不是同一块内存地址
所以main里的str是不变的

以下是证明:

public static void main(String arg[]) {
String str = "hello";
method2(str);
}

public static void myTest(String str) {
String a = str;
str += "world";
System.out.println(a == str);
}
输出结果为false
第4个回答  2011-07-16
java的函数参数只有传值,而没有传引用。

但java的变量类型里面有对象引用的概念,所以你这个是借助对象引用达到了改变字符的目的,二者是不同的。

你这个函数ss的参数是String[]类型,这是一个数组对象的引用,你当然可以通过这个对象引用去访问和修改数组本身的值,但你无法修改这个引用变量本身。也就是说你这个函数ss内尽管可以任意修改abc所指向的数组内的值,但你无法修改这个abc变量本身,比如你无法让abc指向另一个数组对象。

再简洁一点:

并不是说函数内能影响到函数外的数据就一定是引用传参,注意abc是一个“对象的引用”,你这个并没有做到改变函数外面abc的值,你实际上修改的是abc“指向的对象”,而不是修改的“abc本身” 。
--------------------
你那么说也对,因为java中的String是固定不可修改的,任何对String的修改操作都会导致旧的String被丢弃而产生一个新的String替代之,这样原来的字符串引用就改变了。不过这个和你之前问的引用传参没有什么关系,关于没有引用传参的关键证据是“经过ss方法后,abc本身没有改变(abc仍然指向同一个数组),只不过是abc指向的数组的内容发生了改变”
相似回答