public class Start { /**
 * @param args
 */
public static void main(String[] args) {
Bean bean1 = new Bean("001");
Bean bean2 = new Bean("002"); Start start = new Start();
//Begin
start.exchange(bean1,bean2);
System.out.println(bean1.getId());
System.out.println(bean2.getId());
//End
}

private void exchange(Bean b1,Bean b2) {
  Bean bean = b1;
b1 = b2;
b2 = bean;
}}class Bean { private String strId = "";

public Bean() {
//
}
public Bean(String pstrId) {
strId = pstrId;
}

public void setId(String pstrId) {
strId = pstrId;
}

public String getId() {
return strId;
}
}

解决方案 »

  1.   

    运行结果为001,002, CHANGE方法是在内部对BEAN的引用进行了交换,出了作用域后,BEAN1,BEAN2还是指向自己原来的区域
      

  2.   

    001
    002
    如果你不调用change方法,而是把change方法里的代码移植到main方法中就是002 001了
      

  3.   

    因为java是传参数的方式是“传值”的,没有“传应用”这说法
    java中,对象都是传地址的
    所以你这里 exchange(Bean b1,Bean b2)
    只是传了b1,b2的对象的内存地址进方法exchange中
    不管在方法内怎么改对象的地址
    在方法外的b1,b2的地址是没变的
    当然如果你在方法中改b1,b2对象的状态,在方法外是可见的又或者简单的说b1和bean1,b2和bean2的内存地址是一样的
    你在方法内改变b1和b2对象的地址又怎么了,bean1,bean2的地址都是一样,从来没变
      

  4.   

    b1和b2只是bean1和bean2的一个copy
    你改了copy,对原值没影响
      

  5.   

    JAVA中参数都是值传递的,在你的exchange(Bean b1,Bean b2)方法中,传递的并不是对象,而是对象的句柄,这里的b1、b2实际上是两个变量,变量的值是bean1、bean2对象的地址,然后你在里面改变了b1、b2,这对外面的bean1、bean2是没有任何影响的。
    你应该把它改成如下才能完成交换:
    private void exchange(Bean b1,Bean b2) {
                      String tmp = b1.getId();
             b1.setId(b2.getId());
    b2.setId(tmp);
    }
      

  6.   

    后面几个好像讲的挺呕的,用C的理解就是相当于b1和b2是指针,然后交换b1和b2的指向,但bean1和bean2是不变的
      

  7.   

    这个问题,答案上,我还是会认同001,002, 但是,原理上我和大家的想法有所不同,我觉得关键是在这一句:Start start = new Start();这一句,使到内存中重新开劈一段空间来运行main(),从而又
    Bean bean1 = new Bean("001");
    Bean bean2 = new Bean("002");
    //这是第二次初始化,就是说, main执行了两次,bean1,bean2分别都有两个,然后exchange函数,使新的bean1,bean2的指针交换了指向,但是,最后输出的值,还是旧的bean1,bean2,所以是001,002
      

  8.   

    就是所谓的pass by vlaue的问题,函数调用时在栈里分配了两个b1,b2的空间,存放引用指向Bean类的两个对象,之后函数做的是栈里b1,b2的交换,也就是说b1,b2指向的改变,再然后出函数,b1,b2当然就不存在了(被pop了),在这里面在堆中的Bean对象没有作任何的变化.这和C的值传递有类似的地方,我觉得理解的方法就是掌握java对变量的存储的方式.自己也在学习中,大家一起加油^_^
      

  9.   

    又是局部变量,作用域问题!同意kingdoom()
      

  10.   

    001
    002
    说明:
    在java中方法参数有两种类型:
    1)基本数据类型(数字)
    2)对象引用
    一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
    java程序设计语言对对象采用的不是引用调用,实际上,对象引用进行的是值传递。
    注意:”对象引用“与“引用调用”是不同的。
    总结:
    1)一个方法不能修改一个基本数据类型的参数
    2)一个方法可以改变一个对象参数的状态
    3)一个方法不能让对象参数引用一个新的对象
      

  11.   

    这里是传引用的阿,main:
    exchange(bean1,bean2)exchang:
    相当于:Bean b1 = main.bean1;
            Bean b2 = main.bean2;        b1、b2交换,当然不干main.bean1、main.bean2的事了,他们俩指向的对象没有变化/
      

  12.   

    什么域啊,堆啊,都是瞎扯!参数传的引用的copy,换句话说修改的复件,原值没有变化,如果。。只是如果java参数传的是原值,结果就是:
    002
    001
      

  13.   

    1)对象的内容是传址传递,所以改变了对象指向的内容的话比如在exchange中b1.setId('002'),那么这个值就被改掉了
    2)对象的引用是传值传递,对于对象的引用的赋值只是在操作拷贝,并不影响原来那个引用,所以在exchange中b1=b2,只是操作b1的拷贝,所以答案是001,002
      

  14.   

    我们用java来解决实际问题。java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员以及渴望学习java技术的初学者加入讨论。QQ群:3001581
      

  15.   

    怎么无法编译出错
    java.lang.Error: Unresolved compilation problems: 
    bean1.bean2 cannot be resolved or is not a field
    Syntax error on token "Invalid Character", . expected at Start.main(Start.java:14)
    Exception in thread "main" 
    start.exchange(bean1,bean2);这句错
      

  16.   

    lz弄明白java中参数传递的机制就没问题了