http://expert.csdn.net/Expert/topic/1754/1754438.xml?temp=.6287195

解决方案 »

  1.   

    import javax.swing.*;public class SwapTest

        public static void main(String args[])
        {
            int a[]=new int[1], b[]=new int[1];
            String inputA,inputB;
            inputA=JOptionPane.showInputDialog("Enter first integer");
            a[0]=Integer.parseInt(inputA);
            inputB=JOptionPane.showInputDialog("Enter second integer");
            b[0]=Integer.parseInt(inputB);
            swap(a,b);
    // 下一句要改成:访问数组的值
            JOptionPane.showMessageDialog(null,"a is:  "+a[0]+"  b is:  "+b[0],"The result of sawp a and b",JOptionPane.INFORMATION_MESSAGE);
            System.exit(0);
         }
         
         public static void swap(int[] i,int[]j)
         {
     int temp;
            //int temp[]=new int[1];不要change整个数组
            //i=new int[1];这样做是不行的,在函数括号外会被回收
            //j=new int[1];
            temp=i[0];
            i[0]=j[0];
            j[0]=temp;
         }

    试试这个
      

  2.   

    何为传址何为传引用
    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=59569
    说的很清楚,自己看看。
      

  3.   

    “java传递对象时是引用传递的”是一种错误的理解,Java的对象其实应该看成是指针。在这里,swap方法中的形参a, b只是两个临时变量,被调用时,它们分别指向实参所指的对象(相当于指针的拷贝),在swap内部,确实把a,b交换了,但这根本不会影响到原来的对象(main中的a,b)。
       建议看《Java核心技术 卷I》,第4章“对象和类”中这个问题讲得很清楚。
      

  4.   

    很简单,你的函数里面是要改变Interger a,b的引用,而不是改变他的值。
    虽然是传的引用,但是也是要复制的,就是说fun(Interger a,Interger b)
    发生函数调用的时候,实际进入函数体的是另外两个Interger,设为a',b',只不过a'=a,b'=b
    你函数体内改变了a',b'本身的引用,对a,b当然不会有影响,所以退出函数体的时候仍然没有发生变化.只有改变引用的内容时候,才能退出时保持效果。因为改变a'的内容,就是改变a的内容。(引用的作用)但是改变a'的值对a没有影响的。
      

  5.   

    分我已经加了、不够的还可以再加。
    道理也明白了。但是究竟在什么情况下
    传的引用要复制、什么情况下不复制呢?
    再看看这个:
    class apple {
    public String value;
    apple(String value) {
    this.value = value;
    }
    }public class Test {
    static void changC(apple d, String value) {
    d.value = value;
    } public static void main(String[] args) {
    {
    apple ap1 = new apple("10");
    apple ap2 = new apple("20");
    System.out.println("----------before change-------------");
    System.out.println("ap1 = " + ap1.value + ", " + "ap2 = " + ap2.value);
    changC(ap2, "200");
    System.out.println("----------after change-------------");
    System.out.println("ap1 = " + ap1.value + ", " + "ap2 = " + ap2.value);
    }
         }
    }
      

  6.   

    这样肯定会改变了d的值其实我不知道为什么这么多人说Java对于对象是传递引用或者传递值
    Java对于对象的参数传递是传递指针的你的charC方法中你没有改变d的指向对象,d的指向地址没有改变,但是指向地址所
    包含对象的内容改变了,这样的操作是会生效的但是那种swap的方法,其实已经改变了参数指向的地址,
    param = ... 这样已经不是改变param的值,而是改变了param的指向这种操作是不会生效的,因为原来param所指向的对象的值根本没有改变
      

  7.   

    你这样的想法还是拘泥于面向过程的编程方法,而不是面向对象的。
    首先在java中你读某个指针/引用(随便你叫他什么)都正确,但是要改变它却不正确。因为改的只是在这个代码段中这个指针的指向,而其他地方的都没变。
    而面向对象的编程方法不是这样的,
    比如
    class A{
       int x, y;
    }如果你想要改变x,y,在面向过程的方法中, 你在任何可以访问x,y的地方中交换x,y就行了。
    但是面向对象的方法应该是这样的:
    class A{
       int x,y;
       public void swap(int x, y){
          x^=y;y^=x;x^=y;
       }
    }
    这样的好处是,
    首先保证了私隐性,其次,还有一个不为人知的好处
    class A{
       int x, y;
       public boolean canSwap(){
          return x>y && x!=0;
       }
       public void swap(){
          if(canSwap()){
             x^=y;y^=x;x^=y;
          }
       }
    }
    所有事关A的事情都在A内完成,保证了其正确性。
    因此,除了一些局部变量,我都建议用上述的方法,而局部变量基本上在本地活动。
      

  8.   

    对于你的问题,我建议用
    class A{
       Integer a, b;
       .....
       public void swap(){
           Integer temp = a; .....
       }
    }class B{
        public void swap1(A a){
            a.swap(); //better
        }
        public void swap2(A a){
            Integer temp = a.a;//a.getA() or so on.
            a.a=a.b;//or a.setA(a.b) or so on.
            a.b=a.a;
        }
    }
      

  9.   

    这就是局部变量和成员变量的差别。
    另外,还有一个简单的方法,
    Integer[] integer=new Integer[2];
    integer[0]=...;
    integer[1]=....;
    ....
    swap(integer);其实,这也是利用了成员变量