參數傳遞(值傳遞與引用傳遞)


轉:https://www.cnblogs.com/xiaotiaosi/p/6377248.html

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

1、對象是按引用傳遞的
2、Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞(引用傳值傳遞的是原始值的內存地址,其實也是一種按值傳遞)
3、按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本
4、按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本

public class ParamterE2 {

    public static class ParamterE3{
        public String name="xiaotiaosi";
    }

    public static void run(ParamterE3 paramterE3,String a,int b){
        ParamterE3 paramterE=paramterE3;
        paramterE.name="xiaohua111";
        a="girl";
        b=1;
    }

    public static void main(String[] args) {
        ParamterE2 paramterE2=new ParamterE2();
        ParamterE3 paramterE3=new ParamterE3();
        String a="boy";
        int b=0;
        paramterE2.run(paramterE3,a,b);
        System.out.println(paramterE3.name+" "+a+" "+b);
    }
}

 

 

程序運行的結果為:xiaohua111 boy 0

原始對象內的成員變量name的值改變,原始String類型的變量a 和原始int類型的變量b值沒有發生改變。

說明:

1.對象就是傳引用
2.原始類型就是傳值(boolean 、char、byte、short、int、long、float、double)
3.String類型因為沒有提供自身修改的函數,每次操作都是新生成一個String對象,所以要特殊對待。可以認為是傳值。

注:通過查資料發現String類型比較特殊,在Java中,String是一個引用類型,但是在作為參數傳遞的時候表現出來的卻是基本類型的特性。
原因:首先我們看一下String類的實現,String類是通過private final char value[]數組實現的,從給的數組我們能夠發現這個char[]數組使用了final關鍵字修飾,也就意味着,這個String類型的對象不可變,那么就有人要問了,既然不可變,那么我們如何修改字符串的值喃?例如:String str="xiaotiaosi321";如何將已創建的字符串對象修改成"xiaoshuaige321",首先我想給你們掃除一個誤區,String類創建的字符串對象是不可變的,也就是修改不了的,哪有人就要問了,為啥str="xiaoshuaige321";語句好使啊,首先str並不能完全代表String類創建的字符串對象,str只是一個字符串變量的引用,str="xiaoshuaige321";語句只是將str引用指向了"xiaoshuaige321"字符串對象,相當於str=new String("xiaoshuaige321"); ,所以當String作為傳參類型時,在方法中進行了字符串引用的重新復制時,只是將引用指向了新的對象,並沒有對原始的對象進行修改,當方法執行完畢之后,作為虛擬機棧中局部變量都會被銷毀,方法一些操作被還原,str引用重新指向"xiaotiaosi321";,故執行后和執行前值沒有改變。


免責聲明!

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



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