我的第一个java问题,关于字符串的!(150分)

  • 主题发起人 主题发起人 doxpix
  • 开始时间 开始时间
D

doxpix

Unregistered / Unconfirmed
GUEST, unregistred user!
public class Foo{
public static void main (String [] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," + b);
}
static void operate(StringBuffer x, StringBuffer y){
x.append(y);
y = x;
System.out.println(y);
}
}
我运行,结果为
AB
AB,B
我以为应该是
AB
AB,AB
请问如何解释?
 
static void operate(StringBuffer x, StringBuffer y){
x.append(y);
上面是通过x对象的append方法
y = x;
上面只是一个指针吧,x,y指向的都是"AB"了
System.out.println(y);
}
个人理解
 
对,y=x只是值传递,只在函数内有效
 
to 轻舞肥羊, haha2008haha:

static void operate(StringBuffer x, StringBuffer y){
x.append(y);
y = x;
//你们是说这一句吗?下面的println打印出来的可是"AB"啊!!!
System.out.println(y);
}
我不能理解的是
System.out.println(a + "," + b);
这一句打印出来的却是--
AB,B
:((((((((
 
static void operate(StringBuffer x, StringBuffer y){
x.append(y);
y = x;
//没错呀,就是AB,应该是相当于指针的概念吧,
//一个对象的指针指向了另一个对象,原对象被抛弃了,并没有改变,不知道对不对:)
System.out.println(y);
}
 
static void operate(StringBuffer x, StringBuffer y){
x.append(y);
y = x;
//没错呀,就是AB,应该是相当于指针的概念吧,
//一个对象的指针指向了另一个对象,原对象被抛弃了,并没有改变,不知道对不对:)
System.out.println(y);
//<-难道y不是指向b所指向的String吗?调用operate函数时传递的难道不是b的引用吗?那么为什么x倒是指向了a所指向的String了呢?
}
 
是按值传递,形参的改变不影响实参
 
JAVA里面没有指针的说法,你也不可能去操纵指针!因此不管在什么地方,变量总是赋值传递!
也即是说JAVA在对同一一个对象赋值的时候只不过是复制一个对象的引用然后对这个引用进行
修改,而决不会修改原来的内容!
例如
String A="a";
String B="b";
A=B;//<---这里并不是将A的内容修改成b,而是对A复制了B的一个引用使他指向B指向的引用!
A="c";//同样道理,这里只是复制了一个指向“c”的引用,B的内容仍然没有修改。
   //如果按照别的语言标准,这里B的内容会受到影响,但事实是没有!
System.out.println("A="+A+",B="+B);
//结果是:c,b
//而不是:c,c

那原来的内容哪!答案是在回收之前一直存在内存中,直到垃圾回收机制检测到然后回收掉!
同样也不难解释你遇到的情况,那就是在函数体内的两个对象都是原对象引用的复制品,只在函数体
内有效,而且修改的时候只是修改了引用的位置,根本对原有数据不进行操作!
 
现在,我知道了在Java中参数确实是按值传递的.
我在Java研究组织发现了一篇翻译文章是专门讨论这个问题的:
《Java 应用程序中的按值传递语义》
http://www.javaresearch.org/article/showarticle.jsp?column=1&amp;thread=706&amp;message=964&amp;redirect=true&amp;hilite=true&amp;q=%B0%B4%D6%B5%B4%AB%B5%DD%D3%EF%D2%E5
现在我自己来试着解释一下这个问题:
static void operate(StringBuffer x, StringBuffer y){
x.append(y);
//在此处:x是a的一个副本,但是它们指向的是同一个String,所以最终会修改a!
y = x;
//而在此处:y是b的一个副本,把y指向x所指向的String(也即a所指向的String)并不代表着b也会跟着指向a所指向的String!!!
System.out.println(y);
}
谢谢大家的参与,散分!
 
我又说错了,java中也是可以按引用传参数的.如下--
There are only 2 modes in parameter passing in Java functions.
One is for primitives, that is <<pass by value>> i.e. <<pass by copying>>.
The other is for Objects, that is <<pass reference by value>> i.e. java will copy the
reference of an object and pass it to the function.
And that is why you can *never* write a swap function in Java as you can in C or C++.
The common workaround todo
swapping (as used extensive in JDK) is to put the object
you want to swap in an array, and change the index of the array in the swap function.
public static void main(String[] args){
String a="aa", b="bb";
String[] data=new String[2];
data[0]=a;
data[1]=b;
swap(data);
a=data[0];
b=data[1];
//now a="bb";
and b="aa"
}
public static void swap(String[] data){
String temp;
temp=data[0];
data[0]=data[1];
data[1]=temp;
}
 

Similar threads

后退
顶部