不是除基本类型外 ,都是引用吗。那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怎么区分呢
为啥我这个代码期望修改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怎么区分呢
rewrite方法里的str和main里的是两个变量. 执行str="world"后,这两个变量没有任何联系了. rewrite里的 str指向了一个新的字符串. 而main里的 str仍旧指向"hello".
{
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
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楼
楼主是只知其一不知其二啊。
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类,你的思路是清晰的但是String类是比较特殊的,它不允许修改,你看看它的substing()/ replace()等等方法,它都是返回新的对象,而不是对原来对象做修改,不信你可以使下。
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这个值是可以改变的不过要注意初始化