java中值傳遞和引用傳遞

一.java中的值傳遞的問題

指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。示例以下:java

public static void main(String[] args) {
int a=1;
change(a);
System.out.println("交換a後的值:"+a);
}this

private static void change(int a) {
a=1111;
System.out.println("交換方法裏面的a:"+a);
}
//運行輸出
//交換方法裏面的a:1111
//交換a後的值:1
按值傳遞重要特色:傳遞的是值的拷貝,也就是說傳遞後就互不相關了。對象

二.java中的引用傳遞的問題

指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。示例以下:內存

public static void main(String[] args) {
Person p=new Person();
p.setAge(25);
changeAge(p);
System.out.println("改變年齡後的年齡:"+p.getAge());
}字符串

private static void changeAge(Person p) {
p.setAge(35);
System.out.println("改變年齡方法裏面的年齡:"+p.getAge());
}
//運行輸出
//改變年齡方法裏面的年齡:35
//改變年齡後的年齡:35get

class Person{
private int age=10;class

public int getAge() {
return age;
}變量

public void setAge(int age) {
this.age = age;
}
}
傳遞的是值的引用,也就是說傳遞前和傳遞後都指向同一個引用(也就是同一個內存空間),引用類型的傳遞後的修改會影響原來的值。數據類型

從上面兩個例子來看,基本數據類型的傳遞是值傳遞,傳遞過去的是具體的數值;而引用數據類型的傳遞是引用傳遞,傳遞過去的是內存的地址。其實否則,請看下面的兩個例子。引用

三.究竟是值傳遞仍是引用傳遞

請看下面一個例子,String類型也算是引用數據類型,把上面第一個值傳遞的裏面的整形換成字符串類型,例子代碼以下:

public static void main(String[] args) {
String str="哈哈我是字符串";
change(str);
System.out.println("交換字符串後的值:"+str);
}

private static void change(String str) {
str="我在裏面被交換了";
System.out.println("交換方法裏面的字符串:"+str);
}
//交換方法裏面的字符串:我在裏面被交換了
//交換字符串後的值:哈哈我是字符串
交換之後,引用類型的傳遞str並無改變,嘗試使用String s=new String("xxx");嘗試仍是沒有改變.若是說String類比較特殊,請看下面的例子。

public static void main(String[] args) {
Person p=new Person();
p.setAge(25);
changeAge(p);
System.out.println("改變年齡後的年齡:"+p.getAge());
}

private static void changeAge(Person p) {
p=new Person();
p.setAge(35);
System.out.println("改變年齡方法裏面的年齡:"+p.getAge());
}
//運行輸出
//改變年齡方法裏面的年齡:35
//改變年齡後的年齡:25
咱們在方法裏面從新改變person對象的指向,這時若是是引用傳遞,必然會致使p對象裏面的age發生改變,可是實際上並未改變。這裏確實是按照引用傳遞的,可是傳遞的仍是引用的一個副本,並非原始的引用自己。在 Java 應用程序中,當對象引用是傳遞給方法的一個參數時,您傳遞的是該引用的一個副本(能夠認爲特殊的值傳遞),而不是引用自己。

四.總結

在java裏面,通常不可變的對象 例於String 和8大基本數據類型的這些,都是值的傳遞,其餘引用數據類型的傳遞是引用副本的傳遞。

轉載自公衆號: Java引導者

相關文章
相關標籤/搜索