当前位置:编程学习 > JAVA >>

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是不能被修改的。你想使用方法改变就这样:

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"
    }
}
--------------------编程问答-------------------- 这个str就是一个引用
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))    }}
--------------------编程问答--------------------
引用 楼主 seraphsky 的回复:
不是除基本类型外 ,都是引用吗。那String 也是引用咯。
为啥我这个代码期望修改

public class myClass
{
    public static void rewrite(String str)
    {
        str = "world";
    }
    public static void main(Strin……


楼主是只知其一不知其二啊。
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的。不会变化。 --------------------编程问答--------------------
引用 8 楼 abcdhy 的回复:
引用 楼主 seraphsky 的回复:不是除基本类型外 ,都是引用吗。那String 也是引用咯。
为啥我这个代码期望修改

public class myClass
{
    public static void rewrite(String str)
    {
        str = "world";
    }
    public st……


同意!!! 楼主需要多熟悉下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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,