看過一些Java教材的話,對這句話應(yīng)該不陌生:
“在Java里面參數(shù)傳遞都是按值傳遞”這句話的意思是:
按值傳遞是傳遞的值的拷貝,按引用傳遞其實傳遞的是引用的地址值,所以統(tǒng)稱按值傳遞。
簡單的說,基本類型是按值傳遞的,方法的實參是一個原值的復(fù)本。類對象是按對象的引用地址(內(nèi)存地址)傳遞地址的值,那么在方法內(nèi)對這個對象進(jìn)行修改是會直接反應(yīng)在原對象上的(或者說這兩個引用指向同一內(nèi)存地址)。不過要注意String這個類型,如下代碼:
引用傳遞示例
String 非基本數(shù)據(jù)類型,但是String值不可修改
public static void main(String[] args) {
String x = new String("goeasyway");
change(x);
System.out.println(x);
}
public static void change(String x) {
x = "even";
}
結(jié)果

Paste_Image.png
String的對象是不可修改的,如果真正要達(dá)到改變字符串的效果,我們需要使用StringBuilder來替代String。
StringBuffer 代替String,引用示例
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
change(sb);
System.out.println(sb.toString());
}
public static void change(StringBuffer s) {
s.append("hello");
}
結(jié)果

Paste_Image.png
引用傳遞一個對象
static class Student {
public int age;
public String name;
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
}
public static void main(String[] args) {
Student student = new Student(20, "jack");
change(student);
System.out.println(student.toString());
}
public static void change(Student s) {
s.age = 18;
s.name = "alice";
}
結(jié)果:

Paste_Image.png