天天看點

Java中函數參數傳遞和資料存儲

值傳遞是将要傳遞的值作為一副本傳遞的..

引用傳遞,傳遞的是引用對象的記憶體位址..

例如:

int i=4;  

int j=i;   //相當于把4複制了一個副本賦給了j

輸出結果是i=4 ,j=4

c

int *p,*p1;

int j=5;

p=j;    //這裡是把j在記憶體當中的位址賦給了指針p

p1=p;   //這裡是把指針p中儲存的位址(就是j的位址)賦給了指針p1

j=4;    //這裡改變j的值

輸出結果是  j=4  ,  *p=4  ,  *p1=4  //因為p和p1指向的都是j  是以他們的值随j值改變

(以上說明和代碼來自http://zhidao.baidu.com/question/31191252.html)

java中函數參數的傳遞是值傳遞還是引用傳遞?

java中參數傳遞時傳遞到函數中的參數都是原變量的一份拷貝,對于非類類型如int,float等,這份拷貝自然和原變量脫離了關系,這不難了解;

而對于類的執行個體而言,這份拷貝恰巧是執行個體引用的拷貝,它(參數)指向的執行個體位址和原執行個體引用指向的執行個體位址都是一樣的,是以對參數的修改有時也會影響到實

例本身,故此造成了java傳遞類執行個體是傳遞的引用即位址的假象,如下面例子中的changememberfield函數,但是我們把參數指向的位址改到

别的執行個體上時,如changemember函數,我們會發現參數和原執行個體引用再也不會發生關系了,這裡證明java中參數傳遞是完完全全是傳值而不是傳

址。

例子代碼:

代碼:

package com.sitinspring;  

public class changeclass{  

    public void changeint(int i){  

        i=5;  

    }  

    public void changelong(long i){  

        i=555;  

    public void changestring(string str){  

        str="5555";  

    public void changemember(member member){  

        member=new member("cindy",35);  

    public void changememberfield(member member){  

        member.setage(20);  

        member.setname("andy");  

    public static void main(string[] args){  

        changeclass changeclass=new changeclass();  

        int intvalue=10;  

        changeclass.changeint(intvalue);  

        system.out.println(intvalue);  

        long longvalue=10;  

        changeclass.changelong(longvalue);  

        system.out.println(longvalue);  

        string stringvalue="1234";  

        changeclass.changestring(stringvalue);  

        system.out.println(stringvalue);          

        member member2=new member("douglas",45);  

        changeclass.changemember(member2);  

        system.out.println(member2);  

        member member=new member("bill",25);  

        changeclass.changememberfield(member);  

        system.out.println(member);  

}  

public class member{  

    private string name;  

    private int age;  

    public member(string name,int age){  

        this.age=age;  

        this.name=name;  

    public string tostring(){  

        return "member name="+name+" age="+age;  

    public int getage() {  

        return age;  

    public void setage(int age) {  

        this.age = age;  

    public string getname() {  

        return name;  

    public void setname(string name) {  

        this.name = name;  

    }      

輸出:

10

1234

member name=douglas age=45

member name=andy age=20

解釋:

第一個輸出10是因為int是基本類型,傳遞的參數是intvalue的拷貝,對拷貝的修改對原值intvalue沒有影響.

第一個輸出10和上面是一個道理.

第三個輸出1234.由于string是類類型,

str是stringvalue的位址拷貝,參數str指向的位址和stringvalue的一緻,但在函數changestring

中,由于string的特殊性, str=“5555”和str=new string(“5555”)是等價的,

str指向了新的”5555”所在的位址,此句後str就與原來的stringvalue徹底脫離了聯系.

第四個輸出member?name=douglas?age=45的道理和上面相同.

第五個輸出member?name=andy?age=20是因為changememberfield函數中修改了參數member

的值,也就是修改member指向執行個體的值,而這個執行個體正是member指向的值,是以member就變成了name=andy 且age=20.

結論

java中參數傳遞的都是值,對應基本類型,傳遞的是原值的拷貝;對于類類型,傳遞的是引用即位址的拷貝.

對于函數對參數的改變是否會影響原值的問題:值類型自然不會影響到原值.而對于類類型要看改變的是參數的位址還是值,如果是前者,參數和原引用指向了不同的位址,它們自然脫離了關系;如果是後者,修改的執行個體就是原引用指向的執行個體,這當然對原值進行了修改.

java的資料類型分為兩種:基本類型和引用類型。

引用類型分為下面幾種:類類型(class,interface,enum,annotation)和數組類型

java資料類型圖:

                                ┏數值型━┳━整數型:byte short int long

              ┏基本資料類型━━┫              ┗━浮點型:float do

              ┃                ┣字元型:char                                          

資料類型╋                      ┗布爾型:boolean             

              ┃                ┏類(class)

              ┗引用資料類型━━╋接口(interface)

                                ┗數組(array)

數組是引用類型,建立的是對象,如:int[] a = new int[5];則說明a是int型數組對象。其實“一切皆對象”。

參考文章:

<a href="http://blog.csdn.net/jackson__qi/article/details/7982762#reply" target="_blank">http://blog.csdn.net/jackson__qi/article/details/7982762</a>

java資料存儲的介紹,百度文庫的

<a href="http://wenku.baidu.com/view/8c66da7e27284b73f2425056.html" target="_blank">http://wenku.baidu.com/view/8c66da7e27284b73f2425056.html</a>