关于Java方法的参数

刚好看到C++的函数这块,说C++中除了引用类型的形参,其他都是实参的副本(个人总结)。

隐约记得Java中方法的参数也是这么回事,于是手动测试一番。

结果

Java中方法的参数都是值传递,哪怕是引用类型,传递的也是引用本身的副本(指向同一个对象)。

个人以为,将Java中的引用类型的变量看作指针更容易理解。

测试代码

import org.junit.Test;

public class TestFunction {

    @Test
    public void testInt(){
        int a = 3;
        int b = 4;
        swap(a, b);
        System.out.println(a + "---" + b);
    }

    @Test
    public void testString(){
        String a = "hehe";
        String b = "what";
        swap(a, b);
        System.out.println(a + "---" + b);
    }

    @Test
    public void testInner(){
        Inner a=new Inner();
        a.setAge(10);
        Inner b=new Inner();
        b.setAge(20);

        swap(a,b);
        System.out.println(a.getAge() + "---" + b.getAge());

    }

    /**
     * 基本类型,是值传递,所以不会修改原对象
     *
     * @param a
     * @param b
     */
    public void swap(int a, int b){
        a += b;
        b = a - b;
        a -= b;
    }

    /**
     * 字符串也是值传递
     * @param a
     * @param b
     */
    public void swap(String a, String b){
        String tmp = a;
        a = b;
        b = tmp;
    }

    /**
     * 引用,传递的也是引用本身,类似地址。所以只是副本,不会影响原值。
     * @param a
     * @param b
     */
    public void swap(Inner a, Inner b){
        Inner tmp=a;
        a=b;
        b=tmp;
    }

    /**
     * inner class
     */
    class Inner{
        private int age;
        public void setAge(int age){
            this.age=age;
        }
        public int getAge(){
            return this.age;
        }
    }
}

补充

绝大多数时候,我们使用的都是传入对象(引用类型)的成员,所以不会涉及这个问题。因为引用的副本仍然指向同一个对象。

原文地址:https://www.cnblogs.com/larryzeal/p/5583054.html