java编程第二题,答案选择d。请大神说明原因。

如题所述

这一题应该是考变量的作用域的,首先你要明白a,b是是属于main方法内部的,x,y是属于operator()方法范围内的,出了这个方法,这两个变量就相当于不存在。由于方法会产生回调效果,对传进来的参数对象作出改变,比如main()方法中调用operator(),和operator()中调用append(),但是局部变量就不同,不能因为处于operator()方法范围内y变量做了改变,从而影响到了处于main()方法范围内的b变量

你可以在operator()方法内用System.out.println(y);看看结果就明白了。


温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-27
这个很简单,operator 方法接受两个参数,x 和 y。Java 中调用方法都是通过传值的形式,如果是原始数据类型,则传入数据真实的值,如果是对象类型,则传入对象引用地址的值。这个例子传入的是对象,则传入的是引用地址的值。
上面的程序使用 operator(a,b) 调用方法,那么 a 和 b 的引用地址分别传给了 x 和 y。在 operator 方法中,x.append(y) 表示调用 x 引用的对象上的 append 方法,现在 x 引用的对象是 a ,则调用 a.append(y),调用后 a 的值变为 "AB"。方法中的第二行 y=x,表示将 y 的引用地址更改为 x,之后 y 将引用 x 而不再引用 b,以后即使对 y 做任何变更都不再影响 b,因此 b 的值依然是 “B”。本回答被提问者采纳
第2个回答  2014-03-27

第二个图a-->AB忘记画了

第3个回答  2014-03-27
因为StringBuffer的原型是调用了char[]字符数组,数组是引用传递,所以一旦改变,就是改变

所以都可以累加起来,不会丢失

你可以去看看StringBuffer的源码

还有个StringBuilder 效率高,但是多线程不安全,没有使用synchronized,
但是StringBuffer有这个修饰,所以多线程下,安全,但是优先考虑的是StringBuilder
因为大多数情况下,都是单线程的

追问

解释一下d答案的由来

追答楼主再不结贴,就快赶上论坛了
StringBuffer a = new StringBuffer ("A"); // A
StringBuffer b = new StringBuffer ("B"); // B
operator (a,b);
System.out.println (a+","+b);
}

private static void operator ( StringBuffer a, StringBuffer b )
{
a.append (b);// A+B,使用append方法,是对char数组操作,数组是引用传递
b=a; // 内部改变,StringBuffer本身这个类是值传递,虽然在里面被改变,但是本质没有变
}

第4个回答  2014-03-27
这道题考察java的方法参数值传递的问题,在调用java方法时,如果实际参数是简单数据类型(int,char,等等),则是传值;如果实际参数是非简单数据类型(即:传入的是对象),则传地址。这道题在调用operator方法时,参数是StringBuffer对象,因此是地址传递,修改了对象本身,所以方法调用返回后,对象a的值变成了"AB",而对象b的值没有变化。