值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參 數的值。sql
引用傳遞:也稱爲傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,在方法執行中,對形式參數的操做實際上就是對實際參數的操做,方法執行中形式參數值的改變將會影響實際參數的值。 a.傳遞值的數據類型:八種基本數據類型和String(這樣理解能夠,可是事實上String也是傳遞的地址,只是string對象和其餘對象是不一樣的,string對象是不能被改變的,內容改變就會產生新對象。那麼StringBuffer就能夠了,但只是改變其內容。不能改變外部變量所指向的內存地址)。 b.傳遞地址值的數據類型:除String之外的全部複合數據類型,包括數組、類和接口。 值傳遞的例子:
package com.other.test;數組
public class Test {
public static void change(int i, int j) {
int temp = i;
i = j;
j = temp;
} markdown
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);
}
}架構
輸出的結果是 a=3 b=4, 傳遞的值並不會改變原值併發
引用傳遞的例子:(數組)
package com.other.test;分佈式
public class Test {
public static void change(int[] counts) {
counts[0] = 6;
System.out.println(counts[0]);
} ide
public static void main(String[] args) {
int[] count = { 1, 2, 3, 4, 5 };
change(count);
System.out.println(count[0]);
}
}函數
輸出結果是6 6 也就是引用的值改變了原來的值 引用傳遞的例子:(對象)高併發
定義一個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 );
}
}
當把①註解掉時,輸出的結果是1,當①沒有註解是是0,緣由是 a =new A();構造了新的A對象就不是傳遞的那個對象了。 看看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';
}
}
輸出的結果的是 old and dbc也就是傳遞String並不會改變原值,而是建立了一個新值。 ch[]就是一個簡單的數組的傳遞。 ( 對象包括對象引用即地址和對象的內容) String 比較特別,看過String 代碼的都知道, String 是 final的。因此值是不變的。 函數中String對象引用的副本指向了另一個新String對象,而數組對象引用的副本沒有改變,而是改變對象中數據的內容. 對於對象類型,也就是Object的子類,若是你在方法中修改了它的成員的值,那個修改是生效的,方法調用結束後,它的成員是新的值,可是若是你把它指向一個其它的對象,方法調用結束後,原來對它的引用並沒用指向新的對象。 Java參數,無論是原始類型仍是引用類型,傳遞的都是副本(有另一種說法是傳值,可是說傳副本更好理解吧,傳值一般是相對傳址而言)。 若是參數類型是原始類型,那麼傳過來的就是這個參數的一個副本,也就是這個原始參數的值,這個跟以前所談的傳值是同樣的。若是在函數中改變了副本的值不會改變原始的值. 若是參數類型是引用類型,那麼傳過來的就是這個引用參數的副本,這個副本存放的是參數的地址。若是在函數中沒有改變這個副本的地址,而是改變了地址中的值,那麼在函數內的改變會影響到傳入的參數。若是在函數中改變了副本的地址,如new一個,那麼副本就指向了一個新的地址,此時傳入的參數仍是指向原來的地址,因此不會改變參數的值。 歡迎工做一到五年的Java工程師朋友們加入Java羣: 891219277羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!