新聞中心
值傳遞是對(duì)基本型變量而言的,傳遞的是該變量的一個(gè)副本,改變副本不影響原變量. 引用傳遞一般是對(duì)于對(duì)象型變量而言的,傳遞的是該對(duì)象地址的一個(gè)副本, 并不是原對(duì)象本身 。 一般認(rèn)為,java內(nèi)的基礎(chǔ)類型數(shù)據(jù)傳遞都是值傳遞. java中實(shí)例對(duì)象的傳遞是引用傳遞

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、涇縣網(wǎng)站維護(hù)、網(wǎng)站推廣。
Java總是采用按值調(diào)用。方法得到的是所有參數(shù)值的一個(gè)拷貝,特別的,方法不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。
方法參數(shù)共有兩種類型:
-
基本數(shù)據(jù)類型
-
對(duì)象引用
1. 基本數(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;
}
}
【輸出結(jié)果】: 5
可以看到,這個(gè)方法執(zhí)行之后,price的值并沒(méi)有變化。接下來(lái),看一下doubleValue具體的執(zhí)行過(guò)程為:
-
x被初始化為price值的一個(gè)拷貝,即5
-
x乘以2后等于10。但是price沒(méi)有變化,依然是5
-
doubleValue執(zhí)行完后,參數(shù)變量不再使用
2. 對(duì)象引用為參數(shù)
從上面的例子我們已經(jīng)知道一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)。而對(duì)象引用作為參數(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);
}
}
【運(yùn)行結(jié)果】:
90.0
可以看出,Student實(shí)例s的內(nèi)容改變了。
具體執(zhí)行過(guò)程為:
-
s被賦予stu值的拷貝,這里是一個(gè)對(duì)象的引用
-
raiseScore方法應(yīng)用于這個(gè)應(yīng)用。s和stu指向同一對(duì)象,該對(duì)象的分?jǐn)?shù)增加了10
-
raiseScore方法結(jié)束后,s不再使用,stu指向的那個(gè)對(duì)象分?jǐn)?shù)增加了10
3. 對(duì)對(duì)象是值調(diào)用還是引用傳遞?
首先編寫一個(gè)交換兩個(gè)學(xué)生的方法:
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
}
如果java對(duì)對(duì)象是采用的是引用傳遞,那個(gè)這個(gè)方法是可以的。那么x,y對(duì)象的分?jǐn)?shù)是交換的??聪旅娴睦樱?/p>
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的分?jǐn)?shù):" + a.getScore() + "--- b的分?jǐn)?shù):" + b.getScore());
swap(a, b);
System.out.println("交換后:");
System.out.println("a的分?jǐn)?shù):" + a.getScore() + "--- b的分?jǐn)?shù):" + b.getScore());
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
}
}
【運(yùn)行結(jié)果】:
交換前: a的分?jǐn)?shù):0.0— b的分?jǐn)?shù):100.0 交換后: a的分?jǐn)?shù):0.0— b的分?jǐn)?shù):100.0
可以看出,兩者并沒(méi)有實(shí)現(xiàn)交換。說(shuō)明引用傳遞的說(shuō)法是不正確的。接下來(lái)一步一步看看swap調(diào)用的過(guò)程:
-
將對(duì)象a,b的拷貝分別賦值給x,y,此時(shí)a和x指向同一對(duì)象,b和y指向同一對(duì)象
-
swap方法體完成x,y的的交換,此時(shí)a,b并沒(méi)有變化
-
方法執(zhí)行完成,x和y不再使用,a依舊指向new Student(0),b指向new Student(100)
首先,創(chuàng)建兩個(gè)對(duì)象:
然后,進(jìn)入方法體,將對(duì)象a,b的拷貝分別賦值給x,y:
接著,交換x,y的值:
swap執(zhí)行完成,x,y不再使用,回到創(chuàng)建時(shí)狀態(tài)。
從這個(gè)過(guò)程中可以看出,Java對(duì)對(duì)象采用的不是引用調(diào)用,實(shí)際上,對(duì)象引用進(jìn)行的是值傳遞。
總結(jié)一下java中方法參數(shù)的使用情況:
-
一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)(即數(shù)值型和布爾型)
-
一個(gè)方法可以改變一個(gè)對(duì)象參數(shù)的狀態(tài)
-
一個(gè)方法不能讓對(duì)象參數(shù)引用一個(gè)新的對(duì)象
分享文章:探究java關(guān)于值傳遞還是引用傳遞的問(wèn)題
URL網(wǎng)址:http://m.fisionsoft.com.cn/article/dpcihco.html


咨詢
建站咨詢
