看过一些Java教材的话,对这句话应该不陌生:
“在Java里面参数传递都是按值传递”这句话的意思是:
按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
简单的说,基本类型是按值传递的,方法的实参是一个原值的复本。类对象是按对象的引用地址(内存地址)传递地址的值,那么在方法内对这个对象进行修改是会直接反应在原对象上的(或者说这两个引用指向同一内存地址)。不过要注意String这个类型,如下代码:
引用传递示例
String 非基本数据类型,但是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";
}
结果
String的对象是不可修改的,如果真正要达到改变字符串的效果,我们需要使用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");
}
结果
引用传递一个对象
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";
}
结果: