值传递:值传递是将值得地址值传递过去
引用传递 :将句柄的地址传递过去
public static void main(String[] args) { String nameString = "张三"; name(nameString); System.out.println("main--->"+nameString); } public static void name(String name) { name = "李四"; System.out.println("name--->"+name); }
这一次拷贝的是nameString 值"张三",name的值就是张三,所以当name的值不管怎么变化,nameString是不变的。
public class Person { private String nameString; private int age; public Person(String nameString,int age) { this.age = age; this.nameString = nameString; } @Override public String toString() { return "Person [nameString=" + nameString + ", age=" + age + "]"; } public static void name(Person person) { person.age =20; person.nameString="李四"; person = null; } public static void main(String[] args) { Person person = new Person("张三",18); System.out.println(person.toString()); //参数改变前 name(person); System.out.println(person.toString()); // 参数改变后 } }
这一次我们也是拷贝的是一个副本,拷贝的是person对象的副本,拷贝过来的对象和原对象指向同一内存的存储空间,所以当(person -- 拷贝)改变值的时候原person也改变值。
我们知道其实在栈内存当中原person里面存贮着堆内存当中的Person类的内存地址,而java在这里传输的是原person的存贮着的地址值