有關java調用方法參數傳遞的分析


這個問題好多文章都講過了,在此本人補充一下,加深理解,有不足之處請指教。

相信做java開發同學們都知道,調用方法傳遞參數時,不論是基本類還是引用類型,

java都是值傳遞,不存在引用傳遞(稱引用傳遞,只是便於理解,不過看到我下面的例子,就要注意了)。

先看這里例子:預期輸出結果是什么?

public class Test4
{
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        Domain domain = new Domain();
        domain.setName("test01");
        System.out.println("調用chenge方法之前:name=" + domain.getName());
       
        chenge(domain);
       
        System.out.println("調用chenge方法之后:name=" + domain.getName());
       
        /****************************************************/
        domain.setName("www01");
       
        System.out.println("調用chenge2方法之前:name=" + domain.getName());
       
        chenge2(domain);
       
        System.out.println("調用chenge2方法之后:name=" + domain.getName());
    }
   
    public static void chenge(Domain domain)
    {
        domain.setName("test02");
    }
   
    public static void chenge2(Domain domain)
    {
        Domain domain2 = new Domain();
        domain2.setName("wwww02");
        domain = domain2;
    }
}

class Domain
{
    private String name;
   
    public String getName()
    {
        return name;
    }
   
    public void setName(String name)
    {
        this.name = name;
    }
   
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<br>

 

實際輸出結果:

調用chenge方法之前:name=test01
調用chenge方法之后:name=test02
調用chenge2方法之前:name=www01
調用chenge2方法之后:name=www01

-------------------------------------------------------------------------------------

分析:

代碼中方法chenge和chenge2都是應用類型作為入參的;

對於調用方法chenge的結果很好理解;對於調用方法chenge2就要好好分析了。

因為:java中調用方法時的入參都是值傳遞(不管是基本類型還是引用類型)

所謂的值傳遞,按照jdk的介紹,本質是變量名的拷貝被傳到方法中,比如 基本類型變量、引用類型變量,在傳遞到方法中時,

都是該變量的一個拷貝。基本類型的值都保存在棧用中(實際棧的值是共享的),調用方法后不會影響原來的值。

(1)針對例子中的chenge方法:chenge(domain);  這里的變量domain會有一個拷貝傳到chenge方法體內,這個拷貝變量同樣與domain指向之前的對象。

方法chenge中的  domain.setName("test02") 語句,實際修改的是拷貝變量指向的對象,由於變量domain與拷貝變量同時指向一個對象,

變相的修改了domain的指向對象。

因此打印結果為:

調用chenge方法之前:name=test01
調用chenge方法之后:name=test02

(2)由(1)的分析,就好理解chenge2方法了。

chenge2方法是將拷貝變量指向了另一個新的對象,不影響原來的對象,

因此打印結果為:

調用chenge2方法之前:name=www01
調用chenge2方法之后:name=www01


免責聲明!

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



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