请帮忙看下这个JAVA程序的输出结果

public class J_Test
{
String m_kobe = "1";
String[] m_king = {"2"};
public static void main(String[] args)
{
J_Test app = new J_Test();
app.mb_operate(app.m_kobe, app.m_king);
System.out.println(app.m_kobe+app.m_king[0]);
}
static void mb_operate(String kobe, String[] king)
{
kobe = new String("3");
king[0] = new String("4");
}
}
输出结果为什么是14啊,我知道最终是m_kobe="1",m_king[0]=“4”,连接起来就是14,但是为什么经过mb_operate方法后,m_kobe的值没变,但m_king[0]的值变了。String和String[] 都属于引用类型,相当于C的指针那种,为什么只有m_king[0]的值变了。
有关StringBuffer的问题。
public class J_Test
{
public static void mb_method(StringBuffer x, StringBuffer y)
{
x.append(y);
y = x;
}
public static void main(String[] args)
{
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
mb_method(a, b);
System.out.println(a + "," + b);
}
}
那为什么这个程序输出是AB,B啊,如果StringBuffer是引用传递,那么结果应该是AB,AB啊???

我明白了你要表达的意思了,请看下面一段话:

在JAVA里,“=”不能被看成是一个赋值语句,它不是在把一个对象赋给另外一个对象,它的执行过程实质上是将右边对象的地址传给了左边的引用,使得左边的引用指向了右边的对象。JAVA表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的地址,使得该引用指向了对象。在JAVA里,“=”语句不应该被翻译成赋值语句,因为它所执行的确实不是一个赋值的过程,而是一个传地址的过程,被译成赋值语句会造成很多误解,译得不准确。

也就是说在你的mb_method()方法中,参数是引用传递,也就是x,y分别为a,b引用的拷贝,在方法中,你给x追加了值,也就相应的改变了a的值,但是第二条语句:
y = x; 确实将引用y指向了另外一个对象x,这样y就和b只想不同的两个对象了,当然b的值也就不会改变了。

希望对你有帮助,不明白可以追问
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-04
String kobe值传递 String[] king址传递。String是引用类型里面唯一一个会值传递的,跟基本类型一致追问

为什么会有这种奇怪的情况啊:String是引用类型里面唯一一个会值传递的!!!!String在任何情况下都是值传递吗!!?

追答

http://freej.blog.51cto.com/235241/168676/
这个博客分析的挺好的,你可以看看去,就明白了

追问

我刚才做了一个题目,好像StringBuffer也是值传递啊。坑死我了。到底哪种情况是值传递啊。

追答

stringbuffer不会是值传递的。引用类型只有String是。传递就只是涉及调用方法问题,具体操作结果是啥就看你方法内部如何写了

追问

不好意思,超过字数不能追问,你看下我修改的问题,。

第2个回答  2013-06-05
想要知道kobe 为什么 没有变 就要弄清楚2点: 1. kobe是什么类型 2.new String("3")是什么意思(这个东西没有意义上的值)。 king[0]就不一样了!
相似回答