java只存在值傳遞

Java之中的值傳遞問題

其他的程序語言里面都存在值傳遞和引用傳遞兩種傳遞方式 值傳遞就是把值拷貝一次傳遞到調(diào)用的函數(shù)之中 而引用傳遞則是

但是java中只存在值傳遞,只存在值傳遞?。。?/strong>

然而我們經(jīng)??吹綄τ趯ο螅〝?shù)組,類,接口)的傳遞似乎有點像引用傳遞,可以改變對象中某個屬性的值。但是不要被這個假象所蒙蔽,實際上這個傳入函數(shù)的值是對象引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。

Java總是采用按值調(diào)用。方法得到的是所有參數(shù)值的一個拷貝,特別的,方法不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。

方法參數(shù)共有兩種類型:

  • 基本數(shù)據(jù)類型

  • 對象引用

基本數(shù)據(jù)類型作為參數(shù)

public class ParamTest {  
public static void main(String[] args) { 
 int price = 5;  doubleValue(price); 
 System.out.print(price); 
 }

public static void doubleValue(int x) {  x = 2 * x;  }

}

output:5

執(zhí)行過程:

  1. x被初始化為price值的一個拷貝,即5

  2. x乘以2后等于10。但是price沒有變化,依然是5

  3. doubleValue執(zhí)行完后,參數(shù)變量不再使用,形參被回收

java值傳遞基本數(shù)據(jù)類型作為參數(shù).jpg

對象引用作為參數(shù)

class Student {

private float score;

public Student(float score) {  this.score = score;  }

public void setScore(float score) {  this.score = score;  }

public float getScore() {  return score;  }

}

public class ParamTest {  
public static void main(String[] args) {  
Student stu = new Student(80);  
raiseScore(stu);  
System.out.print(stu.getScore()); 
 }

public static void raiseScore(Student s) {  s.setScore(s.getScore() + 10);  }

}

output:

90.0

運行過程:

1.s拷貝了stu的值,他們兩個指向內(nèi)存之中的同一個對象

2.在raiseScore函數(shù)之中,改變了s指向的Student對象的score 但是因為s和stu指向的是內(nèi)存中的同一個地址(也就是同一個對象) 所以這樣實際上就是改變了stu的score

3.函數(shù)調(diào)用結(jié)束之后,釋放形參s。stu依舊指向原來的那個對象,但是score已經(jīng)在函數(shù)中被改變了

java值傳遞對象引用作為參數(shù).jpg

證明對對象是值傳遞的例子

首先編寫一個交換兩個學生的方法:

public static void swap(Student x, Student y) {  Student temp = x;  x = y;  y = temp;  }

如果java對對象是采用的是引用傳遞,那個這個方法是可以的。那么x,y對象的分數(shù)是交換的。看下面的例子:

class Student {

private float score;

public Student(float score) {  this.score = score;  }

public void setScore(float score) {  this.score = score;  }

public float getScore() {  return score;  }

}

public class ParamTest {  
public static void main(String[] args) { 
Student a = new Student(0);  
Student b = new Student(100);
System.out.println("交換前:");  
System.out.println("a的分數(shù):" + a.getScore() + "--- b的分數(shù):" + b.getScore());

swap(a, b);

System.out.println("交換后:");  
System.out.println("a的分數(shù):" + a.getScore() + "--- b的分數(shù):" + b.getScore());  
}

public static void swap(Student x, Student y) {  
Student temp = x;  
x = y;  
y = temp;  }

}

output:

交換前: a的分數(shù):0.0--- b的分數(shù):100.0 交換后: a的分數(shù):0.0--- b的分數(shù):100.0

運行過程:

  1. 將對象a,b的拷貝分別賦值給x,y,此時a和x指向同一對象,b和y指向同一對象

  2. swap方法體完成x,y的的交換,此時a,b并沒有變化

  3. 方法執(zhí)行完成,x和y不再使用,a依舊指向new Student(0),b指向new Student(100)

創(chuàng)建兩個對象

![證明值傳遞3.jpg](https://upload-images.jianshu.io/upload_images/8415275-d7a16b85d48bd488.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

進入方法體,將對象a,b的拷貝分別賦值給x,y


證明值傳遞2.jpg

交換x,y的值 函數(shù)調(diào)用完成之后,x,y被回收 a 、b依舊指向原對象。

證明值傳遞3.jpg

參考博客:https://www.cnblogs.com/xiaoxiaoyihan/p/4883770.html

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容