java参数传递引用和拷贝的区别
不是除基本类型外 ,都是引用吗。那String 也是引用咯。为啥我这个代码期望修改
public class myClass
{
public static void rewrite(String str)
{
str = "world";
}
public static void main(String args[])
{
String str = "hello";
myClass.rewrite(str);
System.out.println(str); //这里输出还是"hello"
}
}
java有什么机制能让在参数传递就是String的情况下,根据引用来修改实参?
C++里这样
void foo(String str ) {} //这里是拷贝
void foo(String &str) {} //这里是引用
java怎么区分呢 --------------------编程问答-------------------- String str = "hello"; 这句为什么变量名和rewrite方法的形参名一样? 楼主何不换个名字试试?
rewrite方法里的str和main里的是两个变量. 执行str="world"后,这两个变量没有任何联系了. rewrite里的 str指向了一个新的字符串. 而main里的 str仍旧指向"hello".
--------------------编程问答-------------------- String是不能被修改的。你想使用方法改变就这样:
--------------------编程问答-------------------- 这个str就是一个引用
public class myClass
{
public static String rewrite(String str)
{
str = "world";
return str;
}
public static void main(String args[])
{
String str = "hello";
str = myClass.rewrite(str);
System.out.println(str); //这里输出还是"hello"
}
}
http://bbs.csdn.net/topics/390354418 --------------------编程问答-------------------- String比较特殊,是值引用。。。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
public class myClass
{
public static String rewrite(String str)
{
str = "world";
return str;
}
public static void main(String args[])
{
String str = "hello";
System.out.println(str); //这里输出还是"hello"
System.out.println(myClass.rewrite(str))
}
}
体会一下~ 2楼 --------------------编程问答-------------------- 楼主可以尝试使用
--------------------编程问答--------------------
public class myClass{ public static String rewrite(String str) { str = new String("world"); return str; } public static void main(String args[]) { String str = new String("hello"); System.out.println(str); //这里输出还是"hello" System.out.println(myClass.rewrite(str)) }}
楼主是只知其一不知其二啊。
Java 内部确实是,除了基本类型,都是引用。
对于引用类型,函数传递的也都是引用(实际为内存地址),不会进行 对象复制。
但 Java 内,还有一种类叫 不可变 类,(其实 C# 也有,F# 就更不用说了)。
这种类的对象,一旦建立,就不能改变, String 就是一个 不可变 类。
表明上 String 是有修改的成员函数, 实际的操作是:函数新建立了一个 String 对象,并将 新对象的地址 重新赋值给引用 而已。
老对象呢? 如果没有其他的 引用 指向他,那就等垃圾回收了。
这也是为什么 String + String 的性能远比 StringBuffer 的 append 函数差的原因。 --------------------编程问答-------------------- 我汗…………
这个问题跟 String 类是 immutable 没有什么关系,这样直接赋值换了可变对象也是一样的结果。
这个问题就算放在C/C++里也是一样的道理。
如果在C里面,变量 str 是一个指针的话,要在一个方法里改变 str 的值,那么传参至少要传“指针的指针”才行,就是说,如果 str 的类型是 char *,那你传进去的 &str 就是 char **。
同样的道理这里你需要传进去的应该是“引用的引用”,不过可惜Java里面没有这种东西(这跟Reference类不一样),所以不行。 --------------------编程问答-------------------- string 这个类是final的。不会变化。 --------------------编程问答--------------------
同意!!! 楼主需要多熟悉下String类,你的思路是清晰的
但是String类是比较特殊的,它不允许修改,你看看它的substing()/ replace()
等等方法,它都是返回新的对象,而不是对原来对象做修改,不信你可以使下。 --------------------编程问答--------------------
public class myClass{
public void f1(StringBuffer str1){
String str2="haha";
str1.replace(0, str1.length(), str2);
System.out.println(str1);
}
public static void main(String[] a) {
StringBuffer cc=new StringBuffer("hello");
myClass o=new myClass();
o.f1(cc);
System.out.println(cc);
}
}
楼主想要改变字符串的值不防这样试试,string类型是不可以改变的他还有另外一种就是stringbuffer这个值是可以改变的不过要注意初始化
补充:Java , Java SE