目前网络中有很多资料讲值传递和引用传递的文章,我查了许多,看得眼花缭乱,因此整理此篇文章来整理下思路和大家分享一下
在我看来不管是传递基本数据类型和引用数据类型,都是属于值传递。只不过传递引用数据类型时,传递的是对象的地址,如Person p = new Person()时,把p作为参数传递时,传递的是p中保存的new的Person的地址(网上很多人把这叫做引用传递),那么在方法中对p的属性进行操作时,原来的p对象的属性也会跟着变化,到这里相信大家都能够明白。
有一个个例就是String,首先要明白的是String也是一个类,下面举个例子对比一下:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class Chuandi { public static void main(String[] args){ Person person = new Person("张三",26); change(person); System.out.println(person.toString()); } public static void change(Person p){ p.setAge(17); p.setName("hiram"); System.out.println(p); } } class Person{ public String name; public int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
上面是我们平时常用的对对象调用的处理
得到的结果为:
Person{name='hiram', age=17}
Person{name='hiram', age=17}
可见方法中对对象属性的修改也改变了原有对象的属性
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面我们对change方法做个修改,添加p = new Person();
public class Chuandi { public static void main(String[] args){ Person person = new Person("张三",26); change(person); System.out.println(person.toString()); } public static void change(Person p){ p = new Person(); p.setAge(17); p.setName("hiram"); System.out.println(p); } }
得到结果为
Person{name='hiram', age=17}
Person{name='张三', age=26}
注意:可见在方法中对属性的修改并没有改变作为参数传递的对象的属性,因为方法中p重新指向了一个新的Person()的地址,再对p的属性做修改时,作为参数传递的Person对象的属性并不会发生改变,这就是我们平常对String对象的操作方法,只不过我们只常用String的简式声明方法String str = "java",这就相当于String str = new String("java"),这是创建一个新的String的过程,不单单是赋值的过程。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面看String的例子
public class Chuandi { public static void main(String[] args){ String str = "java"; change(str); System.out.println(str); } public static void change(String str){ str = "web";//这里相当于str = new String("web"),也就类似于上面的p = new Person(); System.out.println(str); } }自然而然得到的结果不一样了
web
java