天天看點

原因: 實際參數清單和形式參數清單長度不同_Java面試參數傳遞搞不懂?看完你就明白了,都是套路...

方法調用過程中,參數傳遞有兩類:值傳遞、引用傳遞。

值傳遞,方法調用時,實際參數會把值傳遞給方法中對應的形式參數。在方法執行過程中,形式參數值的改變不會影響實際參數的值。

引用傳遞,也稱位址傳遞。方法調用時,實際參數的引用(位址,而不是其真實值)傳遞給方法中對應形式參數。在方法執行過程中,針對形式參數的操作,實際上就是針對實際參數的操作,形式參數值的改變将會影響實際參數的值。

而在Java中,隻有值傳遞。基本類型傳遞的是其值的副本,引用類型傳遞的是其引用的副本。

是以,将會衍生出來幾種面試題,頗具迷惑性。

原因: 實際參數清單和形式參數清單長度不同_Java面試參數傳遞搞不懂?看完你就明白了,都是套路...

簡單版:

public void print() {    int i = 0;        plus(i);        System.out.println(i);}public void plus(int i) {    i = i + 1;}
           

此題答案為0,而并非是1。其原因就是plus方法接到的隻是實際參數 i 的值的拷貝,即0。而plus方法内的 形式參數 i,plus方法無論對其做什麼改變,都不影響原實際參數的值。

進階版:

public void print() {    int i = 0;    plus(i);    System.out.println(i);}public int plus(int i) {    return i++;}
           
public void print() {    int i = 0;    i = plus(i);    System.out.println(i);}public int plus(int i) {    return ++i;}
           

此2題答案依然為0。傳參部分解釋同上。而迷惑你的,無非是plus方法多了傳回值,還有,出現了 i++。一直以來,i++ 和 ++i 都是最易混淆的知識點,加上了這個知識點,更具迷惑性。為啥還是0呢?很簡單,除了傳參部分的原因,plus傳回的值沒有被接收/指派,也是很重要的原因。

但是,plus方法傳回的值被接收/指派,結果就會是 1 嗎?

public void print() {    int i = 0;    i = plus(i);    System.out.println(i);}public int plus(int i) {    return i++;}
           

答案依然為0。為啥呢?簡單的解釋, i++ 先用後加!再來個變種:

public void print() {    int i = 0;    i = plus(i);    System.out.println(i);}public int plus(int i) {    return ++i;}
           

這次答案終于為1了。為啥呢?簡單的解釋,++i 先加後用!

中級進階版:

public void print() {    int a = 3;    int b = 4;    System.out.println("交換前:");    System.out.println("a:" + a + ",b:" + b);    swap(a,b);    System.out.println("交換後:");    System.out.println("a:" + a + ",b:" + b);}public void swap(int m, int n) {    int temp = m;    m = n;    n = temp;}
           

答案是交換前後,并沒有變化。原因依然是值傳遞,形式參數 m 和 n ,得到的依然是實際參數 a 和 b 的值副本,swap方法執行完畢後,m 和 n 作用域失效,實際參數 a 和 b 并無任何影響。

進階進階版:

public void print() {    int ages[] = {1, 2, 3};    System.out.println("交換前:");    System.out.println("第一個元素:" + ages[0] + ",最後一個元素:" + ages[ages.length - 1]);    swap(ages);    System.out.println("交換後:");    System.out.println("第一個元素:" + ages[0] + ",最後一個元素:" + ages[ages.length - 1]);}public void swap(int[] ages) {    int temp = ages[0];    ages[0] = ages[ages.length - 1];    ages[ages.length - 1] = temp;}
           

答案是互換成功。什麼原因呢?值傳遞依然是傳遞的 ages 數組對象的引用的拷貝,均指向 ages 數組對象。是以,針對 ages 數組對象的引用的拷貝做操作,相當于直接對 ages 數組對象操作,均會改變其内容。

究極進階版:

public void print() {    Person a = new Person(0);    Person b = new Person(100);    System.out.println("交換前:");    System.out.println("a的年齡:"+a.getAge()+"-----------b的年齡:"+b.getAge());        swap(a,b);    System.out.println("交換後:");    System.out.println("a的年齡:"+a.getAge()+"-----------b的年齡:"+b.getAge());}public void swap(Person x, Person y) {    Person temp = x;    x = y;    y = temp;}
           

答案是互換不成功,依然是原來的值。

通過這幾道面試題,是否對Java參數傳遞,有了不同的認識呢?再好好的了解了解吧!