java中值傳遞和引用傳遞以及String是屬於什麼傳遞?
目前網路中有很多資料講值傳遞和引用傳遞的文章,我查了許多,看得眼花繚亂,因此整理此篇文章來整理下思路和大家分享一下
在我看來不管是傳遞基本資料型別和引用資料型別,都是屬於值傳遞。只不過傳遞引用資料型別時,傳遞的是物件的地址,如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{ publicString 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