简单的赋值,高手指点一下是怎么算出来的?

希望对你有帮助 2012-11-07 02:51:06

import java.io.Serializable;

public class A implements Cloneable, Serializable{
public int number;
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}




public class TempTest {

private void test1(A a) {
a.number = 5;
System.out.print(" " + a.number);
}

private void swap(A a, A b) {
A temp = a;
a = b;
b = temp;
System.out.println(" " + a.number);
System.out.println(" " + b.number);
}

public static void main(String[] args) throws Exception {
TempTest test = new TempTest();
A a = new A();
a.number = 3;
A b = new A();
b.number = 4;
test.swap(a, b);
System.out.println(" " + a.number);
System.out.println(" " + b.number);
test.test1(a);
System.out.println(" " + a.number);
A c = (A) a.clone();
test.test1(c);
System.out.println(" " + a.number);
}
}




结果输出:

4
3
3
4
5 5
5 5


高手指点一下是怎么算出来的?
...全文
135 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
locc 2012-11-07
  • 打赏
  • 举报
回复
呵呵 理解问题,
zxhcloth 2012-11-07
  • 打赏
  • 举报
回复
"但是刚刚test.swap(a, b);的时候也是重新创建的对象,没有影响下面的值,现在却会 输出 5 而不是 3 ?" 哈哈,swap方法里面其实只是改变了栈变量的引用而已,并没有改变堆里面的对象的值。swap参数里的a变量和main方法里的a变量他们在栈里面是两个不同的变量,只不过它们都同时指向同一个堆对象。(当然在执行了你的swap方法后,swap方法里的a变量指向了b变量原来指向的堆对象)。 test1(a)方法里直接改变了a变量指向的堆对象的值,所以main方法和test1方法都输出5(因为他们指向同一个堆对象)
  • 打赏
  • 举报
回复
引用 3 楼 zxhcloth 的回复:
没有计算啊,就是一些正常的赋值、改变值,唯一区别的就是最后一个 A c = (A) a.clone();它是克隆了一个跟a一模一样的堆区域,但这时是两个区域了,不像之前都是在一个区域上操作。
test.swap(a, b);的时候重新创建对象,不影响现有对象,所以输出 43 34 test.test1(a); 的时候也是重新创建对象,只是test1()里面重新赋值了输出 5 但是刚刚test.swap(a, b);的时候也是重新创建的对象,没有影响下面的值,现在却会 输出 5 而不是 3 ?
zxhcloth 2012-11-07
  • 打赏
  • 举报
回复
没有计算啊,就是一些正常的赋值、改变值,唯一区别的就是最后一个 A c = (A) a.clone();它是克隆了一个跟a一模一样的堆区域,但这时是两个区域了,不像之前都是在一个区域上操作。
  • 打赏
  • 举报
回复
引用 1 楼 zxhcloth 的回复:
有什么问题?是哪里不明白?
结果是怎么算出来的?
zxhcloth 2012-11-07
  • 打赏
  • 举报
回复
有什么问题?是哪里不明白?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧