先看看代码以及运行结果:
注释写得很清楚了,我就不多说了。
我说说我的结论,其实在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); } }