关于对象引用,还是没搞明白
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 就可以看成和一般的基础数据类型一样 ,是值传递的