Java中的参数传递是和C++不一样的。 对于这样的函数 class A{ void fun1(A o) { o = null; } public static void main(String args[]) { A a = new A(); A b = new B(); a.fun1(b); 这里执行完了,b!=null; } }但如果这个传递是C++的引用传递的话 结果就不一样的,b=null;所以,Java对象参数传递类似于C里面的指针值传递。 fun1(void *p) { p = NULL;//这是无效的; *p = 1;//这是有效的 }也就是说,在Java中你能改变作为参数传入的对象实体的成员, 但不能改变对像实体的本身。 也就是说第一个帖子中的那两个函数的赋值运算是没有什么用处的。
刚才打错了 A a = new A(); A b = new B(); ````````````````````这里应该是A b = new A();
对不起,这里打错了 A a = new A(); A b = new B(); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这里应该是A b = new A();
app.m1(s1);结束时s指向“111hello”,s1仍指向"111".
void m1( String s )
{
s = s.concat("hello");
System.out.println(s.concat("hello"));
}
class TestCommon{
static String s1 = "111";
static StringBuffer s2 = new StringBuffer("111") ; String m1( String s ) {
s = s.concat("hello");
return s;
}
void m2( StringBuffer s ) {
s = s.append( "hello") ;
}
public static void main(String args[]) {
TestCommon app = new TestCommon();
String ss = app.m1(s1);
app.m2(s2);
System.out.println("s1 = "+s1);
System.out.println("ss = "+ss);
System.out.println ("s2 = "+s2);
}}
static StringBuffer s2= new StringBuffer("111") ; void m1( String s ) {
s = s.concat("hello");
}s1 向方法m1中的s传递一个值,而s的值的改变不会影响s1的值.
s2 向方法m2中的s是按引用传递的,所以s 的值的改变会影响s2的值.
文章详细阐述过了。
至于这个问题。关键在于String 与 StringBuffer类的不同。
String类的方法都是返回一个新产生的String,而自身不变。
但StringBuffer不一样,它的方法都是在自身上作修改,然后返回自身。
在你的例子中,导致s2值变化的原因在于append()方法,而不是那个赋值
也就是说
void m2( StringBuffer s ) {
s = s.append( "hello") ;
} 改成
void m2( StringBuffer s ) {
s.append( "hello") ;
}
效果也是一样的。
class TestString1{
static String s1 = new String("111");
public static void main(String args[]) {
s1 = s1.concat( "s3") ;
System.out.println("s1="+s1);
}}
看看结果
赋值生效
改变s1的值是因为s1指向了新的String"111s3",而这个"111s3"是由s1.concat("s3")产生的。
你可以试试看这个
class TestString1{
static String s1 = new String("111");
public static void main(String args[]) {
s1.concat( "s3") ;
System.out.println("s1="+s1);
}}
若想改变,则用StringBuffer定义变量。
对于这样的函数
class A{
void fun1(A o)
{
o = null;
}
public static void main(String args[])
{
A a = new A();
A b = new B();
a.fun1(b);
这里执行完了,b!=null;
}
}但如果这个传递是C++的引用传递的话
结果就不一样的,b=null;所以,Java对象参数传递类似于C里面的指针值传递。
fun1(void *p)
{
p = NULL;//这是无效的;
*p = 1;//这是有效的
}也就是说,在Java中你能改变作为参数传入的对象实体的成员,
但不能改变对像实体的本身。
也就是说第一个帖子中的那两个函数的赋值运算是没有什么用处的。
A a = new A();
A b = new B();
````````````````````这里应该是A b = new A();
A a = new A();
A b = new B();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这里应该是A b = new A();
谢谢各位的回复,现在开始送分了。