日期:2014-05-20  浏览次数:20710 次

关于对象引用,还是没搞明白
class   Base
{
public   int   i;
public   Base(int   a)
{
i=a;
}
}

public   class   StringTest   {  
    public   static   void   changeStr(String   str){  
        str= "welcome ";  
    }  
    public   static   void   changeBase(Base   b)
    {
    b.i=6;
    }
   
    public   static   void   main(String[]   args)   {  
        String   str= "1234 ";  
        Base   base=   new   Base(3);
        changeBase(base);
        System.out.println(base.i);
        changeStr(str);  
        System.out.println(str);  
    }  
}  

我以为我明白了,可惜还是没明白
changeBase按“对象引用”的规则修改了i的值,
可是changeStr却没按“对象引用”规则,依然是“1234”
为什么呢?

------解决方案--------------------
String对象有点特别
一但生成一个String对象
你就永远无法改变它
------解决方案--------------------
第一个改变,传的是对象进去,“对象引用”的规则.
JAVA里面不存在传地址,所以依然是“1234”

------解决方案--------------------
第一个传的是对象b 对象b是不能改变的
第二个传的是string string自然也不能直接改变
------解决方案--------------------
你这样改下你看看
public static String changeStr(String str){
return "welcome ";
}
public static void changeBase(Base b)
{
b.i=6;
}

public static void main(String[] args) {
String str= "1234 ";
Base base= new Base(3);
changeBase(base);
System.out.println(base.i);
str = changeStr(str);
System.out.println(str);
}

String是不变类,必须显示更改结果
------解决方案--------------------
String and 基本类型都是fianl型的!你可以看看引用传递和值传递部分的书
------解决方案--------------------
str = changeStr(str);语句的作用其实就相当于

str = "welcome ";直接把返回值赋给str,所以显示出来字符串改变了
------解决方案--------------------
我是这样理解的:改变的是str的副本
------解决方案--------------------
http://www.javaeye.com/topic/25483

java是永远都是传值,没有传引用。。。
------解决方案--------------------
哎,同志们好好读书!
------解决方案--------------------
不知道我说的对不对,大家来说下
因为实际上传递的是引用的副本,所以的话,
Base base= new Base(3);
changeBase(base);
base引用只改变了对象的一个属性,并没有改变对象,
String str= "1234 ";
changeStr(str);
str对象的副本已经被重写指向了“welcome”这个string对象,但是实际上str还是没有被修改,所以打印出来的还是1234,如果在changeStr(str)函数里增加一条打印语句估计会打印出welcome
------解决方案--------------------
String 就可以看成和一般的基础数据类型一样 ,是值传递的