JAVA-参数传递(所有的参数传递都是值传递)

1.基本类型:基本类型作为参数传递时,是对传递值的拷贝,无论怎么改变这个拷贝,原值是不会发生变化的。

public class Test {
    public static void main(String[] args) {
        int i = 3;
        System.out.println("before: " + i);
        change(i);
        System.out.println("after: " + i);
    }  
    public static void change(int v) {
        v++;
    }
}
image.png

2.引用类型:
先看一下引用类型在内存的储存结构:String str = "hello";

image.png

在引用类型作为参数传递时,是把对象在内存中的引用地址拷贝了一份传给参数,而不是把对象拷贝。一旦引用地址发生改变时,操作的就不是原来的对象。

String

package cn.jxufe.test;

import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        String str = "hello ";
        System.out.println("str的值:" + str);
        System.out.println("str的hash值:" + str.hashCode());
        change(str);
        System.out.println("传参改变后str的值:" + str);
    }  
    public static void change(String str) {
        System.out.println("传参得到的str的hash值:" + str.hashCode());
        str += "world";
        System.out.println("传参改变后str的hash值:" + str.hashCode());
    }
}
image.png

String 类是比较特殊的,其内部是 final char[],所以当 str += "world";时相当于新创建了一个对象 str1 = "hello world",然后再将 str1 的引用地址赋值给 str;所以传参之后改变了 str 的值,与之前传入的引用地址是两个地址。


image.png

StringBuffer

package cn.jxufe.test;

import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        StringBuffer strbuf = new StringBuffer("hello ");
        System.out.println("传参之前的strbuf值:" + strbuf);
        System.out.println("传参之前的hash值:" + strbuf.hashCode());
        change(strbuf);
        System.out.println("传参之后的strbuf值:" + strbuf);
        System.out.println("传参之后的hash值:" + strbuf.hashCode());
    }  
    public static void change(StringBuffer strbuf) {
        strbuf.append("world");
    }
}
image.png

StringBuffer 是可变的字符串,传入的是 strbuf 的引用地址,引用地址可以操控其对象的内容,因此将 strbuf 传参改变之后引用地址并不会改变。
image.png
package cn.jxufe.test;

import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        StringBuffer strbuf = new StringBuffer("hello ");
        System.out.println("传参之前的strbuf值:" + strbuf);
        System.out.println("传参之前的hash值:" + strbuf.hashCode());
        change(strbuf);
        System.out.println("传参之后的strbuf值:" + strbuf);
        System.out.println("传参之后的hash值:" + strbuf.hashCode());
    }  
    public static void change(StringBuffer strbuf) {
        strbuf = new StringBuffer("Hi ");
        strbuf.append("world");
    }
}
image.png

当传参后 strbuf 被赋值了新的对象地址时,传参之前的 strbuf 就不会发生改变。
image.png

你可能感兴趣的:(JAVA-参数传递(所有的参数传递都是值传递))