问一JAVA基础题,下面程序打出来结果是:AB,B
main调用operate(a,b)时,是对象引用的传递,传递a、b的地址给operate,在y=x的操作时,应该能改变b的值,为什么变量b的值没有发生改变呢?偶看不明白,请大家指点一下吧:)public class T{
public static void main(String[] arg){
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;
}
}
main调用operate(a,b)时,是对象引用的传递,传递a、b的地址给operate,在y=x的操作时,应该能改变b的值,为什么变量b的值没有发生改变呢?偶看不明白,请大家指点一下吧:)public class T{
public static void main(String[] arg){
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;
}
}
解决方案 »
- 如何判断一个字符串的开头是不是数字?
- 正则表达式匹配后缀名
- //关于double 类型 转换成 float 类型出错,等待解决.
- 问两个小问题(eclipse和tomcat的) 谢谢!
- 初学者,很简单的问题,JAVA需要像C++那样包含类吗?
- 请问rowset和resultset有什么区别?它都使用在什么情况下,谢谢,给分。
- 请大家帮看看,错误提示是“Exception in thread "main" java.lang.NoClassDefFoundError: HH”
- 想做个bbs系统,不知道需要准备什么?
- 为什么我的IE总是找不到com.sum.java.swing.JScrollPane?
- 访问与调用的问题
- java私塾是这么对我的,大家进来看看
- ftp.login()后直接报connection reset?
没懂,如你所说把x的引用赋予给y,而在这之前x已经变成了AB了,那么y=x应该是引用AB才对啊
x y 也是2个指针 是形参a b 和 x y之间的传递是值传递
因此,形参y=x这句话,并不能影响到b,因此b仍然指向对象“B”但x.append (y);不一样,由于a和x指向同一个对象,因此利用x对该对象的改变,同样可以通过a来体验到,因此【a所指向的对象】变成了“AB”指针 指针指向的对象 不一样啊!!!一定要搞清楚
a指向地址0001,0001存着值A
b指向地址0002,0002存着值B
调用operate()后
x指向地址0001,0001存着值A
y指向地址0002,0002存着值B
x.append(y);
将x所指向的地址的内容改变为AB,这个时候x依然指向0001,但是0001中保存的值变为了AB
y=x;
再将y指向的地址变的和x所指向的地址相同,这个时候y指向地址0001,y引用AB
而b并没有改变引用地址,他依然指向0002地址,并且0002地址的值也没有改变最终结果
a=AB
b=B
x=AB
Y=AB
public static void main(String[] arg){
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);
System.out.println(x);
System.out.println(y);
y = x;
System.out.println(x);
System.out.println(y);
}
}
==========
结果:
AB
B
AB
AB
AB,B
可以看到第二个System.out.println(y);
的地方,得到的值是AB果然很奇怪·值传递不像值传递,抵制传递不像地址传递
并不是a指向了x
想要a变成AB
至少要让a指向y
原以为y = x 是把x指向内容赋给y指向的内容-------------- 错!!!!
应该y = x 是值的传递,把x的值赋给y, 使y指向x所包含的地址,对b没有任何的改变
就这么一句话,改变了a值,我是看不出哪里还会改变b值;
operate方法里也没地方改变a、b的值。
我哪里有错,请指教……