前言
相信大多數(shù)學(xué)習(xí)java的人都曾有過這樣的疑惑,java參數(shù)傳遞究竟是怎么一回事?
1.是不是傳基本類型就是值傳遞,傳對象就是引用傳遞?。?br>
2.為啥在傳遞引用的方法中,有時形參變化實參跟著變了,有時卻沒有呢?
3.java只有值傳遞?
本文就是圍繞這幾個問題,針對java參數(shù)傳遞進行學(xué)習(xí)歸納與總結(jié)。如有錯誤,敬請指正。
概念
在開始學(xué)習(xí)之前,首先得弄明白什么是值傳遞,什么是引用傳遞?
值傳遞(pass by value)是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對參數(shù)進行修改,將不會影響到實際參數(shù)。
引用傳遞(pass by reference)是指在調(diào)用函數(shù)時將實際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)所進行的修改,將影響到實際參數(shù)。
以上概念來自于百度百科,也是網(wǎng)絡(luò)上的主流說法。
思考
1.根據(jù)這個概念,豈不是承認(rèn)了第一個問題:傳基本類型就是值傳遞,傳對象就是引用傳遞?
因為我們知道,基本類型傳遞就是值的拷貝,對象傳遞實際傳遞的是對象的地址的拷貝。
2.如這概念所言,引用傳遞在函數(shù)中對形參就行修改,那實際參數(shù)就會受到影響。為什么對于第二個問題,實際傳遞地址之后,函數(shù)內(nèi)對形參進行修改,實參也未必受到影響啊?
3.地址的拷貝是否算值的復(fù)制從而算值傳遞呢?這不就對應(yīng)了網(wǎng)上的java只有值傳遞的說法嗎?
4.讀到這里,可能對值傳遞、引用傳遞定義產(chǎn)生疑問,再一百度,發(fā)現(xiàn)值傳遞和引用傳遞其實是一種求值策略。然后又產(chǎn)生一系列的疑問...
所以,我想說的是沒必要去扣字眼來糾結(jié)于究竟是值傳遞還是引用傳遞,這些字面上的歧義是很容易將人引入誤區(qū)的,理解了本質(zhì)就行啦
我們來看一下這段測試的代碼:
package com.weixin.javalearingtest;
public class Person {
int age;
int height;
Person(int age,int height){
this.age=age;
this.height=height;
}
public static void main(String[] args){
Person alex =new Person(10,10);
alex.setAge(0);
alex.newPerson(alex);
System.out.println("[" + alex.age + "," + alex.height + "]");
Person army =new Person(9,9);
System.out.println("[" + alex + "]");
exchange(alex,army);
System.out.println("[" + alex.age + "," + alex.height + "]"+"[" + army.age + "," + army.height + "]");
}
private void setAge(int age){
this.age = age;
}
private void newPerson(Person a){
a=new Person(2,3);
}
private static void exchange(Person a,Person b){
System.out.println("[" + a + "]");
Person temp = a;
a=b;
b=temp;
temp.setAge(120);
temp=new Person(8,8);
}
}
運行結(jié)果:
[0,10]
[com.weixin.javalearingtest.Person@42a57993]
[com.weixin.javalearingtest.Person@42a57993]
[120,10][9,9]
顯然,當(dāng)實參是對象時,傳遞給形參的實際是實參對象在堆中地址的拷貝,形參調(diào)用方法改變自身,則實參也跟著改變,而形參的重引用對實參無影響。
于是嘞,我們的結(jié)論就出爐嘍。
結(jié)論
當(dāng)傳遞的參數(shù)是基本類型時,傳遞的是值的拷貝。
當(dāng)傳遞的參數(shù)是引用類型時,傳遞的是實參在堆中地址的拷貝。
當(dāng)參數(shù)是基本類型時,方法無法對其改變。(這其實是基本類型不可變性質(zhì)所決定的)
當(dāng)參數(shù)是引用類型時,可對其進行狀態(tài)的改變,但不可改變其引用。