轉:https://www.cnblogs.com/xiaotiaosi/p/6377248.html
按值傳遞和按引用傳遞。按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本。因此,如果函數修改了該參數,僅改變副本,而原始值保持不變。按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本。因此,如果函數修改了該參數,調用代碼中的原始值也隨之改變。
1、對象是按引用傳遞的
2、Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞(引用傳值傳遞的是原始值的內存地址,其實也是一種按值傳遞)
3、按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本
4、按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本
程序運行的結果為: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";,故執行后和執行前值沒有改變。