真正了解java中的参数传递

220 阅读1分钟

sh首先看一下这段代码和运行结果:

public class TestInteger {

    public static void main(String[] args) {
        Integer a = 129;
        Integer b = 200;
        System.out.println("交换前:" + "a = " + a + " " + "b = " + b);
        swap(a, b);
        System.out.println("交换后:" + "a = " + a + " " + "b = " + b);
        String string1 = "1";
        String string2 = "2";
        System.out.println("交换前:" + "string1 = " + string1 + " " + "string2 = " + string2);
        swapStr(string1, string2);
        System.out.println("交换后:" + "string1 = " + string1 + " " + "string2 = " + string2);

        MyString myString1 = new MyString("1");
        MyString myString2 = new MyString("2");
        System.out.println("交换前:" + "myString1 = " + myString1 + " " + "myString2 = " + myString2);
        swapMyStr(myString1, myString2);
        System.out.println("交换后:" + "myString1 = " + myString1 + " " + "myString2 = " + myString2);

        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("hello");
        System.out.println("before = " + stringBuffer.toString());
        stringBufferNew(stringBuffer);
        System.out.println("afterStringBufferNew = " + stringBuffer.toString());
        stringBufferAppend(stringBuffer);
        System.out.println("afterStringBufferAppend = " + stringBuffer.toString());

    }

    private static void swap(Integer numA, Integer numB) {
        Integer temp = numA;
        numA = numB;
        numB = temp;
    }

    private static void swapStr(String string1, String string2) {
        String temp = string1;
        string1 = string2;
        string2 = temp;
    }

    private static void swapMyStr(MyString myString1, MyString myString2) {
        myString1 = null;
        myString2 = null;
    }

    private static void stringBufferAppend(StringBuffer stringBuffer) {
        stringBuffer.append(" world");
    }

    private static void stringBufferNew(StringBuffer stringBuffer) {
        stringBuffer = new StringBuffer();
        stringBuffer.append(" world");
    }

    static class MyString {
        public MyString(String name) {
            this.name = name;
        }

        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "MyString{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

}

运行结果:
交换前:a = 129 b = 200
交换后:a = 129 b = 200
交换前:string1 = 1 string2 = 2
交换后:string1 = 1 string2 = 2
交换前:myString1 = MyString{name='1'} myString2 = MyString{name='2'}
交换后:myString1 = MyString{name='1'} myString2 = MyString{name='2'}
before = hello
afterStringBufferNew = hello
afterStringBufferAppend = hello world

你分析对输出结果了没有?java中是值传递还是引用传递?

在我看来,java中都是值传递,引用传递也是值传递的一种。当某个变量作为参数传入方法时,其实是复制了变量的值到栈中,修改参数值,就是修改已经复制出来的变量的值,原变量值不变。当传入的是对象的引用,对引用变量做了赋值操作,也和值传递一样,只改变了copy的变量值,真实值不变。若是修改引用对象的值,则已经将对象修改,所以对象修改生效。