1. 基本概念
形參:用來(lái)定義方法時(shí)使用的參數(shù)籽孙。只有在被調(diào)用的時(shí)候虛擬機(jī)才分配內(nèi)存空間适瓦,調(diào)用結(jié)束后德迹,釋放所分配內(nèi)存空間。因此生命周期僅僅存在于方法內(nèi)揭芍,針對(duì)引用對(duì)象的改動(dòng)無(wú)法影響到方法外胳搞。
通俗點(diǎn)講:只是定義時(shí)走形式,只是內(nèi)部折騰一圈称杨,針對(duì)外部并沒(méi)有什么實(shí)質(zhì)改變效果肌毅。
實(shí)參: 用于調(diào)用時(shí)傳遞給方法的參數(shù)。實(shí)參在傳遞給別的方法之前是需要被預(yù)先賦值的姑原。
通俗點(diǎn)講:是騾子是馬悬而,拉出來(lái)溜溜,初始化時(shí)锭汛,就需要給定明確的值笨奠,折騰起來(lái)是有實(shí)際改變效果的。
值傳遞: 方法調(diào)用時(shí)唤殴,實(shí)際參數(shù)把它的值傳遞給對(duì)應(yīng)的形式參數(shù)般婆,函數(shù)接收的是原始值的一個(gè)copy, 此時(shí)內(nèi)存中存在兩個(gè)相等的基本類(lèi)型朵逝,即實(shí)際參數(shù)和形式參數(shù)蔚袍,后面方法中的操作都是對(duì)形參這個(gè)值的修改,不影響實(shí)際參數(shù)的值配名。
通俗點(diǎn)講:基本類(lèi)型的傳遞啤咽,因?yàn)樘玖耍荒鼙桓那觥>拖窭罟砀铄佑钫罟砘瘖y的再像,改變不了李逵本尊...
引用傳遞:也稱(chēng)為 地址傳遞连舍, 址傳遞没陡。方法調(diào)用時(shí),實(shí)際參數(shù)的引用(地址索赏,而不是參數(shù)的值)被傳遞給方法中相對(duì)應(yīng)的形式參數(shù),函數(shù)接收的是原始值的內(nèi)存地址 在方法執(zhí)行中贴彼,形參和實(shí)參內(nèi)容相同潜腻,指向同一塊內(nèi)存地址,方法執(zhí)行中對(duì)引用的操作將會(huì)影響到實(shí)際對(duì)象器仗。
通俗點(diǎn)講:引用傳遞融涣,改變的是同一塊內(nèi)存地址的數(shù)據(jù)童番。就像李逵穿上了不同的馬甲,不同的馬甲下面套著的都是李逵威鹿,做任何變更剃斧,改變的都是本尊...
2. 舉些栗子
case1 : 引用傳遞:如果參數(shù)是對(duì)象,方法內(nèi)操作不會(huì)改變實(shí)參對(duì)象的引用忽你,但如果改變了對(duì)象的內(nèi)容幼东,就會(huì)改變實(shí)參對(duì)象的內(nèi)容。
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Init");
stringBufferAppend(sb);
System.out.println("sb = " + sb.toString());
}
public static void stringBufferAppend(StringBuffer sb) {
sb.append("_Append");
}
運(yùn)行結(jié)果:
sb = Init_Append
case2 : 引用傳遞:參數(shù)是對(duì)象科雳,如果沒(méi)有改變對(duì)象內(nèi)容本身根蟹,則對(duì)象的值不會(huì)發(fā)生變化。
public static String stringJoin(String str){
str += "_JOIN";
return str;
}
String s = "Init";
stringJoin(s);
System.out.println("傳遞引用后s = " + s);
s = stringJoin(s);
System.out.println("函數(shù)返回賦值s = " + s);
輸出結(jié)果:
傳遞引用后s = Init
函數(shù)返回賦值s = Init_JOIN
case3 : byte,short,int,long,char,float,double,boolean 這8種基本類(lèi)型糟秘。
傳實(shí)參時(shí)简逮,參數(shù)為基本數(shù)據(jù)類(lèi)型,數(shù)據(jù)本身不會(huì)改變尿赚。
public static void changeBaseType(int a ,int b) {
int temp = 0;
temp = a;
a = b;
b = temp;
}
int a = 1;
int b = 2;
changeBaseType(a, b);
System.out.println("a :" + a + ", b: "+b );
輸出結(jié)果:
a :1, b: 2
case4 : 傳的參數(shù)為對(duì)象類(lèi)型散庶,傳遞過(guò)程中實(shí)參的地址傳給了形參,形參屬性的改變是對(duì)實(shí)參的操作凌净。
public static void changeObjectProperty(ObjectModel model) {
int temp = model.a;
model.a = model.b;
model.b = temp;
}
static class ObjectModel {
public int a = 1;
public int b = 2;
}
ObjectModel demo = new ObjectModel();
System.out.println(demo.a + "\t" + demo.b);//a== 1, b == 2
changeObjectProperty(demo);
System.out.println(demo.a + "\t" + demo.b);//a== 2, b == 1
輸出結(jié)果:
1 2
2 1