java面試題:當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,並可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?


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

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

 

1.Java中沒有指針,所以也沒有引用傳遞了,僅僅有值傳遞。不過,可以通過對象的方式來實現引用傳遞。類似java沒有多繼承,但可以用多次implements接口實現多繼承的功能。

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

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

4.Java應用程序中的變量可以為以下兩種類型之一:引用類型或基本類型。當作為參數傳遞給一個方法時,處理這兩種類型的方式是相同的。兩種類型都是按值傳遞的,沒有一種按引用傳遞。

 

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

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

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

  引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,方法執行中形式參數值的改變將會影響實際參數的值。
 
示例代碼如下:
// 在函數中傳遞的是基本數據類型
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的子類,如果你在方法中修改了它的成員的值,那個修改是生效的,方法調用結束后,它的成員是新的值;但是如果你把它指向一個其它的對象,方法調用結束后,原來對它的引用並沒用指向新的對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM