public class abc {
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
oper(a, b);
System.out.print(a + "," + b);
} static void oper(String c, String d) {
c=c+"b";
d = c;
}
}
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
oper(a, b);
System.out.print(a + "," + b);
} static void oper(String c, String d) {
c=c+"b";
d = c;
}
}
你的oper函数没有改变a,b对象的指向,所以当主调函数执行的时候,oper没有产生实际结果
我的语言组织的不好,反正这快和C语言指针那快有点象,不知道我说的明不明白
c=c+"b";
d = c;
System.out.print("Look here "+c+ "," + d);
}
修改的是c,d 调用完了这个函数 c,d对象被释放掉了
请大虾指点指点
请大虾指点指点
是啊,,我认为string也是传的地址,,,
http://community.csdn.net/Expert/topic/5215/5215343.xml?temp=.1856348
这里有我对一道题的分析,对各位的问题应该有帮助
1、Java中对象进行传递是引用传递。
2、java中String是不可变的。oper(a, b);//此时,a,c一起指向"A";b,d一起指向"B"
c=c+"b";d = c;//因为String是不可变的,所以c和d指向新字符串“Ab”(注意是产生了新字符串),而a,b的指向仍然没变,还是原来的字符串如果想要产生你所要的那样,需要使用StringBuffer
c,d 只不过是两个指针, 他们指向别的对象,并不影响 a,b的值啊
Stirng是个不可变的类啊 Effective Java...
Java中对象进行传递是引用传递。传的只是一个引用值;
只有改变引用值 应用的的变量才会类的内容才会发生变化
所以上面的问题不涉及到 sanpi828() 说的java中String是不可变的。下面证明
public class Zlong {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
oper(a, b);
System.out.print(a + "," + b);
} static void oper(StringBuffer c, StringBuffer d) {
c=c.append("b");
d = c;
}
}
Ab,B
b-->内存B;oper(c,d)--->
a-->内存A<--c;
b-->内存B<--d;c=c+"b";
d = c;c+"b"在内存中生成一个新的对象 内存C<---c
d=c d-->内存C
最终结果
内存AB中数据无变化
而ab始终指向内存ABOK
String a = new String("A");
String b = new String("B");
System.out.print(a + "," + b);
一样!所以是A,B
其实问题很简单,只要了解如下基本知识:
1、变量类型
值 变 量:用于代表存储大小确定的值
引用变量:用于代表存储大小不定的值
2、变量存储
栈:分配的存储空间不可改变,在超过作用域后能够自动回收
堆:分配的存储空间可以改变,在超过作用域后需要垃圾回收
值 变 量:只在栈中申请一个与自己值域匹配的空间,用于存放自身的值
引用变量:先在栈中申请一个与 CPU 寻址能力匹配的空间,用于存放一个地址值
再在堆中申请一个存放自身实例的空间,并把这个空间的首地址放入栈中预先申请的空间
变量名:都是程序代码中栈空间的首地址的代表,程序编译时,变量名会被替换为相对于栈首地址的偏移量
3、方法的参数传递
值 传 递:方法的形参申请自己的存储空间,运行时把方法调用时的实参值复制给形参的方式
引用传递:方法的形参不申请自己的存储空间,让方法的形参与实参共享同一存储地址的方式
4、Java的参数传递方式:值传递
对于值参数,把实参值复制给形参,所以值参传递时形参在方法中的改变不影响实参。
对于引用参数,也是把实参值复制给形参,只是这次复制的值是实参的栈空间中存放的值(栈中存了堆中的首地址值),也就是说:实参与形参将共用同一个堆空间。为此:
方法中如果改变了堆空间中的内容,实参能同步改动;
方法中如果改变了形参本身的栈中值(存放了一个新的堆空间首地址值),由于是值传递,实参是不变的在本例中
由于对String对象的改变操作会创建一个新的实例由原变量接收,也就是在方法中String形参改变的实质上是栈中值,所以实参是不会变的