Java中沒有指針咬扇,所以也沒有引用傳遞了料祠,僅僅有值傳遞不過可以通過對象的方式來實(shí)現(xiàn)引用傳遞 類似java沒有多繼承 但可以用多次implements 接口實(shí)現(xiàn)多繼承的功能
值傳遞:方法調(diào)用時(shí)橙垢,實(shí)際參數(shù)把它的值傳遞給對應(yīng)的形式參數(shù)矗积,方法執(zhí)行中形式參數(shù)值的改變不影響實(shí)際參 數(shù)的值艺沼。
引用傳遞:也稱為傳地址扒秸。方法調(diào)用時(shí),實(shí)際參數(shù)的引用(地址趾代,而不是參數(shù)的值)被傳遞給方法中相對應(yīng)的形式參數(shù)贯底,在方法執(zhí)行中,對形式參數(shù)的操作實(shí)際上就是對實(shí)際參數(shù)的操作撒强,方法執(zhí)行中形式參數(shù)值的改變將會(huì)影響實(shí)際參數(shù)的值禽捆。
? ? ? ?a.傳遞值的數(shù)據(jù)類型:八種基本數(shù)據(jù)類型和String(這樣理解可以糯俗,但是事實(shí)上String也是傳遞的地址,只是string對象和其他對象是不同的,string對象是不能被改變的睦擂,內(nèi)容改變就會(huì)產(chǎn)生新對象。那么StringBuffer就可以了杖玲,但只是改變其內(nèi)容顿仇。不能改變外部變量所指向的內(nèi)存地址)。
? b.傳遞地址值的數(shù)據(jù)類型:除String以外的所有復(fù)合數(shù)據(jù)類型摆马,包括數(shù)組臼闻、類和接口?
值傳遞的例子:
package com.other.test;
public class Test {
public static void change(int i, int j) {
int temp = i;
i = j;
j = temp;
}
public static void main(String[] args) {
int a = 3;
int b = 4;
change(a, b);
System.out.println("a=" + a);
System.out.println("b=" + b);
}
}
輸出的結(jié)果是 a=3 b=4,傳遞的值并不會(huì)改變原值
引用傳遞的例子:(數(shù)組)
package com.other.test;
public class Test {
public static void change(int[] counts) {
counts[0] = 6;
System.out.println(counts[0]);
}
public static void main(String[] args) {
int[] count = { 1, 2, 3, 4, 5 };
change(count);
System.out.println(count[0]);
}
}
輸出結(jié)果是6 6 也就是引用的值改變了原來的值
引用傳遞的例子:(對象)
定義一個(gè)A對象:
package com.other.test;
public class A {
int i = 0;
}
對上邊對象操作的類:
package com.other.test;
public class Test {
public static void add(A a) {
//a = new A();? ①
a.i++;
}
public static void main(String args[]) {
A a = new A();
add(a);
System.out.println(a.i );
}
}
當(dāng)把①注解掉時(shí)囤采,輸出的結(jié)果是1述呐,當(dāng)①?zèng)]有注解是是0,原因是 a =new A();構(gòu)造了新的A對象就不是傳遞的那個(gè)對象了蕉毯。
看看String的情況:
package com.other.test;
public class Test {
String str = new String("old");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Test ex = new Test();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.println(ex.ch);
}
public void change(String str, char ch[]) {
str = "new";
ch[0] = 'd';
}
}
輸出的結(jié)果的是 old and dbc也就是傳遞String并不會(huì)改變原值乓搬,而是創(chuàng)建了一個(gè)新值。 ch[]就是一個(gè)簡單的數(shù)組的傳遞代虾。
( 對象包括對象引用即地址和對象的內(nèi)容)
String 比較特別进肯,看過String 代碼的都知道, String 是 final的棉磨。所以值是不變的江掩。 函數(shù)中String對象引用的副本指向了另外一個(gè)新String對象,而數(shù)組對象引用的副本沒有改變,而是改變對象中數(shù)據(jù)的內(nèi)容.?
對于對象類型,也就是Object的子類乘瓤,如果你在方法中修改了它的成員的值环形,那個(gè)修改是生效的,方法調(diào)用結(jié)束后衙傀,它的成員是新的值抬吟,但是如果你把它指向一個(gè)其它的對象,方法調(diào)用結(jié)束后统抬,原來對它的引用并沒用指向新的對象拗军。?
Java參數(shù),不管是原始類型還是引用類型蓄喇,傳遞的都是副本(有另外一種說法是傳值发侵,但是說傳副本更好理解吧,傳值通常是相對傳址而言)妆偏。?
如果參數(shù)類型是原始類型刃鳄,那么傳過來的就是這個(gè)參數(shù)的一個(gè)副本,也就是這個(gè)原始參數(shù)的值钱骂,這個(gè)跟之前所談的傳值是一樣的叔锐。如果在函數(shù)中改變了副本的值不會(huì)改變原始的值.
如果參數(shù)類型是引用類型挪鹏,那么傳過來的就是這個(gè)引用參數(shù)的副本,這個(gè)副本存放的是參數(shù)的地址愉烙。如果在函數(shù)中沒有改變這個(gè)副本的地址讨盒,而是改變了地址中的值,那么在函數(shù)內(nèi)的改變會(huì)影響到傳入的參數(shù)步责。如果在函數(shù)中改變了副本的地址返顺,如new一個(gè),那么副本就指向了一個(gè)新的地址蔓肯,此時(shí)傳入的參數(shù)還是指向原來的地址遂鹊,所以不會(huì)改變參數(shù)的值。