先看看代码以及执行结果:
凝视写得非常清楚了。我就不多说了。
我说说我的结论。事实上在java中没有传值还是传址的概念,java仅仅有引用的概念。引用类似传址。只是是一个变量名中保存着对象的地址,地址指向一个对象。
引用又类似传值。对于方法来说形參和实參都是变量名,变量名中的地址是一样的,说他像传值是由于变量的值(保存的地址)是从实參传递到形參的。
上面是我的看法。欢迎大家一起讨论这个观点。
上源代码,不愿意写又想自己试试的往下看:
package com.elong.valueoraddress; public class Student { private int id; private String name; private int classId; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getClassId() { return classId; } public void setClassId(int classId) { this.classId = classId; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", classId=" + classId + "]"; } }
package com.elong.valueoraddress; import org.junit.Test; public class TestStudent { //变量名中存的是对象的地址 @Test public void test() { Student student = new Student(); student.setId(1); student.setName("elong"); student.setClassId(1); //传入的是student中存放的对象地址 change(student); System.out.println(student); } public void change(Student student){ Student student2 = new Student(); student2.setId(2); student2.setName("elongdeo"); student2.setClassId(2); //对student指向的对象进行属性变动 student.setId(3); student.setName("dingyinlong"); student.setClassId(3); //student = student2表示把student2指向的对象的地址赋值给student student = student2; //对原student2指向的对象进行属性变动 student.setId(4); student.setName("yinlong"); student.setClassId(4); } }