java面試題:當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏究竟是值傳遞仍是引用傳遞?

答:是值傳遞。Java編程語言只有值傳遞參數java

當一個對象實例做爲一個參數被傳遞到方法中時,參數的值就是該對象的引用一個副本。指向同一個對象,對象的內容能夠在被調用的方法中改變,但對象的引用(不是引用的副本)是永遠不會改變的。編程

 

1.Java中沒有指針,因此也沒有引用傳遞了,僅僅有值傳遞。不過,能夠經過對象的方式來實現引用傳遞。相似java沒有多繼承,但能夠用屢次implements接口實現多繼承的功能。數組

2.在Java應用程序中永遠不會傳遞對象,而只傳遞對象的引用。所以是按引用傳遞對象。但重要的是要區分參數是如何傳遞的。編程語言

3.Java應用程序按引用傳遞對象這一事實並不意味着 Java 應用程序按引用傳遞參數。參數能夠是對象引用,而 Java應用程序是按值傳遞對象引用的。函數

4.Java應用程序中的變量能夠爲如下兩種類型之一:引用類型或基本類型。看成爲參數傳遞給一個方法時,處理這兩種類型的方式是相同的。兩種類型都是按值傳遞的,沒有一種按引用傳遞。spa

 

  按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本。所以,若是函數修改了該參數,僅改變副本,而原始值保持不變。指針

  按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本。所以,若是函數修改了該參數的值,調用代碼中的原始值也隨之改變。若是函數修改了該參數的地址,調用代碼中的原始值不會改變。code

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

  引用傳遞:也稱爲傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,在方法執行中,對形式參數的操做實際上就是對實際參數的操做,方法執行中形式參數值的改變將會影響實際參數的值。
 
示例代碼以下:
// 在函數中傳遞的是基本數據類型
public class Test {  
    public static void main(String[] args) {  
        int a = 3;  
        int b = 4;  
        change(a, b);  
  
        System.out.println("a=" + a); // 3
        System.out.println("b=" + b); // 4  
    }  

    public static void change(int i, int j) {  
        int temp = i;  
        i = j;  
        j = temp;  
    }  
}  
  
結果爲:  

a=3  
b=4  
緣由:參數中傳遞的是基本數據類型a和b的拷貝,在函數中交換的也是那份拷貝的值,而不是數據自己。
// 在函數中傳的是引用數據類型  
public class Test {  
    public static void main(String[] args) {  
        int[] count = { 1, 2, 3, 4, 5 };  
        change(count);
     Sysout.out.println(count[0]); // 6 }
public static void change(int[] counts) { counts[0] = 6; } }
結果爲:
6 緣由:在方法中,傳遞引用數據類型int數組,實際上傳遞的是該數組的地址值,他們都指向數組對象,在方法中能夠改變數組對象的內容。
// 傳遞的是對象的引用  
class A {  
    int i = 0;  
}  
  
public class Test {      
    public static void main(String args[]) {  
        A a = new A();  
        add(a); // 1  
        System.out.println(a.i);  // 0
    }  
    
    public static void add(A a) {  
        a = new A();  
        a.i++;
        System.out.println(a.i); 
    }  
}

結果爲:

1
0 緣由:在該程序中,對象的引用指向的是A,而在add方法中,傳遞的引用的一份副本則指向了一個新的對象,並對新的對象進行操做。而原來的A對象並無發生任何變化。引用指向的是仍是原來的A對象。
// String 不改變,數組改變
public class Example {  
    public static void main(String args[]) {  
        Example ex = new Example();  
        ex.change(ex.str, ex.ch);  
        System.out.print(ex.str + " and "); // good and
        System.out.println(ex.ch); // gbc
    }  
    
    String str = new String("good"); // good 是常量,不能改
    
    char[] ch = { 'a', 'b', 'c' };  
  
    public void change(String str, char ch[]) {  
        str = "test ok"; // test ok 又是一個常量,也不能改   等價於 String str1 = new String("test ok");
        ch[0] = 'g';  
    }  
} 

結果爲:

good and gbc 

緣由:String類比較特別,看過String類代碼的都知道,String類是final修飾的。因此值是不變的。 
函數中String對象引用的副本指向了另一個新String對象,而數組對象引用的副本沒有改變,而是改變對象中數據的內容。
對於對象類型,也就是Object的子類,若是你在方法中修改了它的成員的值,那個修改是生效的,方法調用結束後,它的成員是新的值;可是若是你把它指向一個其它的對象,方法調用結束後,原來對它的引用並沒用指向新的對象。
相關文章
相關標籤/搜索