首页 > 试题广场 >

以下代码结果是什么? public class foo {

[单选题]
以下代码结果是什么?
public class foo {
    public static void main(String sgf[]) {

        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;
    }
}
  • 代码可以编译运行,输出“AB.AB”。
  • 代码可以编译运行,输出“A.A”。
  • 代码可以编译运行,输出“AB.B”。
  • 代码可以编译运行,输出“A.B”。
推荐
这里简单地说,a,b,x,y就是四个指针。y本来指向的是b所指向的对象,但是一个“=”,y就指向了x所指向的目标即是a指向的对象,因此原来b所指向的目标并没有发生任何改变。与y不同的是,x进行的是对象操作,此时此对象在内存中是真正的本质上的改变。有点绕,但是手机打字,没发画图,不然其实很容易理解。
编辑于 2017-03-19 19:58:24 回复(15)
往方法中传参,传的仅仅只是地址,而不是实际内存,所以不要以为y=x程序的执行,是 b=a的执行。这两者是不相等的
编辑于 2017-07-05 21:44:46 回复(34)
b和y两个引用指向同一个内存区域,但是y在函数中又指向了其他地址,但是b指向的内存区域中的值没有改变。
发表于 2017-03-10 20:07:47 回复(0)
引用a指向对象A
引用b指向对象B
引用x指向对象A
引用y指向对象B
在operate方法中,引用x指向的对象A被连接了B,对象A也就被改变为AB
然后又把引用y指向了x所指向的对象地址,也就是此时引用a,x,y指向同一个对象AB
而引用b没有发生任何变化,依旧指向对象B。
编辑于 2017-03-20 13:10:20 回复(8)
发表于 2017-09-27 16:14:35 回复(3)
其实理解起来需要慢慢体会,在引用传递过程中 a和x指向同一个对象! b和y也是注指向同一个对象! x.appand(y)只是改变a所指对象的内容,a和x还是指向同一个对象! 而y=x,却已经把引用y改变,此时y与b所指对象已经不一样咯!故对b没有改变! 还要注意的一点是,x.appand()已经自动地把新的字符串赋值给引用x
发表于 2017-02-12 09:45:30 回复(5)
StringBuffer不是基本类型,所以传递是引用传递,所以通过调用append方***影响a

如果一个(引用传递)参数a通过=号改变数据空间(如new或者直接赋值为null等),则该参数会被编译器解析为与a同类型同名的局部变量,原来的引用会在此方法中消失。
发表于 2016-12-11 16:49:43 回复(2)
发表于 2022-01-05 10:40:53 回复(0)

可能画的不太全面,但大概就是这个意思吧,有不对的地方还请指正
当对象 a,b 传入方法 operate 时,就让 x , y 分别指向原来 a , b 指向的堆空间(ab仍然指向堆空间),那么x.append操作就真实的操作了方法区中数据 将 A变成了AB,但是y = x只是让y指向了x指向的空间,当方法调用结束后,xy也随之销毁,就没有作用了,还是a 和 b指向两个空间,所以选C。
发表于 2021-11-15 15:26:54 回复(2)

C

x.append(y)是对x所指向的堆进行操作,修改后x与a依然指向这个堆,所以可以修改成功

y=x,等于修改了y的指向,b的指向还是以前的地方

发表于 2017-04-03 16:05:35 回复(1)
很典型的一个java是值传递还是引用传递问题,答案是java只有值传递。传递的是引用副本的地址的数值。
发表于 2017-03-01 17:30:12 回复(0)
传参是把实参的值(本题 是A B的地址)给形参一份,不是把形参替换成实参,形参 x 和 y 的变化不影响 a 和 b,a 和 b 的地址指向不变。
发表于 2017-11-17 00:21:04 回复(0)
答案:C
发表于 2016-12-06 20:16:45 回复(2)
x进行对象操作,所指向对象地址没变,对象内容变成了AB;而y进行赋值,使指向的对象地址变了,变成了现在x指向的地址,而其原来指向地址的对象还是那样,即b所指向的对象B并没有变
发表于 2018-04-10 22:47:22 回复(2)
y=x不等价于b=a
发表于 2017-01-27 07:33:43 回复(0)

解析:正确答案选择C。在main方法中a,b为引用储存的是对象StringBuffer的地址,所以掉用方法时,将它们两个指向的地址传入了方法中,x.append(y)是在x对象的末尾追加了y对象,通过引用操作对象,这个对象是a指向的对象。

y=x,对引用来说,赋值等于将地址赋值给引用,所以这个意义在于x,y都指向了x指向的对象。

发表于 2017-09-01 22:32:50 回复(0)
关键在于传参,形参和实参是两个不同的引用,只不过在一开始时都指向B而已。
改变形参y的指向,不会改变实参b的指向
发表于 2022-02-12 16:13:49 回复(0)
根本原因还是java只能传值,而不能传引用
发表于 2021-12-03 09:34:28 回复(0)
1.刚调用operate方法时,引用a、x指向对象A,而引用b、y指向对象B;
2.执行“x.append(y)”后,引用x指向的对象A被连接了B,对象A也就变成了AB。此时,引用a、引用x指向对象AB,而引用b、引用y指向对象B;
3.执行“y=x”后,引用a、x、y指向对象AB,而引用b没有发生任何改变,仍然指向对象B。
发表于 2018-07-25 11:49:57 回复(0)
这题错了真是不应该。java方法传递参数是值传递。也就是说operate(x,y)会将a和b的值各拷贝一份,赋给x和y。但是注意这里a,b不是基本类型而是引用!!作为拷贝,x和y也都是引用,指向对象StringBuffer("A")和StringBuffer("B")。也就是说a和x 指向了同一个对象。x会影响a就是因为这个。
 所以接下来的步骤中,x.append(y),就是将x引用的对象从StringBuffer("A")变成了StringBuffer("AB")
 ,a引向不变,也引向StringBuffer("B")。  y=x,意味着y也引向StringBuffer("AB"),但是b依然引向StringBuffer("B")。
发表于 2017-09-29 14:33:12 回复(1)
关于引用与传值的问题
发表于 2017-03-08 17:53:23 回复(0)