首页 > 试题广场 >

执行以下程序后的输出结果是()

[单选题]
执行以下程序后的输出结果是()
public class Test {
    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A"); 
        StringBuffer b = new StringBuffer("B"); 
        operator(a, b); 
        System.out.println(a + "," + b); 
    } 
    public static void operator(StringBuffer x, StringBuffer y) { 
        x.append(y); y = x; 
    }
}

  • A,A
  • A,B
  • B,B
  • AB,B
推荐
 StringBuffer a = newStringBuffer("A"); 
    StringBuffer b = newStringBuffer("B"); 

此时内存中的状态如下图所示:


publicstaticvoidoperator(StringBuffer x, StringBuffer y) { 
    x.append(y); y = x; 
}
进入如下方法后,内存中的状态为:


 x.append(y);
这条语句执行后,内存的状态为:


 y = x; 
这条语句执行后,内存的状态为:


operator方法执行完毕后内存中的状态为:因为方法执行完毕,局部变量消除。

有内存中的状态,可以知道最后的结果。

编辑于 2015-08-15 22:08:37 回复(154)
a和x是同个地址,b和y是同个地址,然后执行x.append(y)就把y的值放在x的地址里面此时a地址和x是同一个所以a就是AB了,接着执行y=x是把x的地址给y,这时候axy属于同一个地址。
所以y=x 只是改变了y的地址没改变b的地址,所以b还是B。
发表于 2017-10-19 16:23:57 回复(16)
一句话解决:string是值传递,stringbuffer是引用传递。。所以就这样了。
发表于 2015-08-17 14:15:25 回复(25)

Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值. 如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。

发表于 2016-09-03 15:01:57 回复(10)
a,b是对象的引用,指向堆内存,将a,b两个引用传给x,y,执行x.append(y),改变了x引用指向的堆内存的存储内容,变为AB, y = x,表示引用y,指向引用x指向的存储区域,没有改变引用b,指向的存储空间的内容。
发表于 2015-08-13 20:48:56 回复(0)
x,y是a,b的副本,x.append(y)使得AB在一起,而y=x后,y指向AB,方法结束后x,y消亡,故a-AB,b-B;

发表于 2015-08-13 17:41:38 回复(3)
y = x;这一句没有改变实参的值
发表于 2015-08-13 14:54:30 回复(0)
发表于 2016-03-20 22:01:15 回复(1)
发表于 2017-04-28 22:26:59 回复(0)
还是要仔细看看官方关于Passing Information to a Method or a Constructor的介绍http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html
Passing Reference Data Type Arguments
Reference data type parameters, such as objects, are also passed into methods by value. This means that when the method returns, the passed-in reference still references the same object as before. However, the values of the object's fields can be changed in the method, if they have the proper access level.  
这里说到引用数据类型(Reference data type)如一个对象(object)的传递,是以值的形式传进方法(are also passed into methods by value)。这意味着当函数执行完(when the method   returns),传进去的引用(the passed-in reference)仍然参考(指向)之前的对象(still references the same object as before)。但是,对象的值(字段)可以在方法中被改变。 
好了翻译完了看看这一题
public static void operator(StringBuffer x, StringBuffer y) { 
    x.append(y); y = x; 
}
在这个方法范围内: 
x.append(y)改变了a的内容,由"A"变为"AB"。根据"the values of the object's fields can be changed in the method, if they have the proper access level."可以知道在方法执行完之后之前(before)的对象a的内容也改变了,即"AB"。y = x这一句是把引用y指向引用x所指向的对象a。根据"This means that when the method returns, the passed-in reference still references the same object as before.",因而在方法结束之后b还是指向之前的对象(new StringBuffer("B")),值还是"B"。 
因而答案是D。
编辑于 2017-06-10 07:56:19 回复(5)
两种情况:
1.当方法传入的是普通的基本类型,传入的就是局部变量的副本,不会改变原始值;
2.当方法传入的是引用类型,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
发表于 2019-09-10 17:43:46 回复(3)

这个是StringBuffer类的一个方法,用来把后面的字符串接到原来的字符串上面来
编辑于 2020-08-07 23:06:57 回复(0)
a,b是对象的引用,指向堆内存,将a,b两个引用传给x,y,执行x.append(y),改变了x引用指向的堆内存的存储内容,变为AB, y = x,表示引用y,指向引用x指向的存储区域,没有改变引用b,指向的存储空间的内容。
发表于 2018-10-11 23:13:21 回复(0)
mcq头像 mcq
首先大家都知道Java的参数传递有值传递和引用传递两种方式,只有基本数据类型int ,double, byte,char等的传递是值传递,其它都是引用传递,包括包装类Integer, Double, Byte, Character, String等。但是由于String等是基本不变类,是无法修改值的,所以哪怕在进行参数传递的时候,如果尝试修改其值,那么虚拟机会重新分配一个新的内存给String,而StringBuffer是可变类,可以修改其值,因此对a或者x的操作都将改变该内存的值。但是需要注意的,调用方法的临时变量x,y本身是两个新的变量,所以在函数返回的时候,System.out.println打印只关心a,b的值,显然这里的a被修改了值,但是b的值没有被修改
发表于 2016-04-28 11:15:15 回复(0)
java中都是值传递,则基本类型传入时不会做任何改变,复杂类型传入时,传入的指针不能被覆盖,但所指向的对象属性却可以改变。
发表于 2015-10-27 10:28:55 回复(0)
java只有值传递 ,对于引用类型传递的是地址,地址指向的内容可变,但地址不可变。x.append(y)没有改变地址,所以a的值改变了;而y=x改变了地址,所以b的值不变。
发表于 2020-10-05 00:06:32 回复(0)
注意几点
1String是不可变的,StringBuffer是可变的
2注意形参和实参的区别
发表于 2018-11-06 19:51:39 回复(0)
引用指向改变,
发表于 2016-07-25 10:24:25 回复(0)
y=x 只是改变了y的地址没改变b的地址,所以b还是B。
发表于 2021-08-23 22:54:44 回复(0)
y = x; //将对象x的引用赋值给对象y的引用
      但是StringBuffer是final修饰的,也就是StringBuffer的实例的引用一旦确定就不可以改变,但是引用所指的内容可以改变!

发表于 2021-02-03 09:33:46 回复(0)
最开始a,x指向A,b,y指向B。经过append方法,将B复制到a,x所指向的地址,此时a,x指向AB,y指向B。经过y=x后,只是将x的地址赋给了y,此时axy指向同一个地址,值为AB。但b未经过任何改变。因此仍为B。
发表于 2020-05-28 20:24:07 回复(0)