1、基參數(shù)是本數(shù)據(jù)類型 傳遞是值(或者說值得副本)硼被。
2、參數(shù)是對象的話傳遞的是對象引用的副本。(1.修改引用副本指向新對象不會影響原來對象吉执,2.修改引用指向的對象的屬性會修改成功,3三痰。如果傳遞時string腰懂,修改引用指向string對象不會修改成功,string是不可變的隅津,原引用對象不變诬垂。4.傳的是bigdecimal,對bigdecimal引用指向對象進行add伦仍。muidibel等不會修改原bigdicimal,如果你d=d.add(c),這樣會給引用指向新對象)
這是一個Java的經典問題结窘,大部分人從C,C++語言入門充蓝,C語言有三種傳遞方式:值傳遞隧枫,地址傳遞和引用傳遞。詳細的對C語言指針谓苟,引用的我個人的理解官脓,見鏈接。
Java所有操作都是傳值操作涝焙!都是傳值操作卑笨!都是傳值操作!重要的事情說三遍纱皆。
疑問湾趾?那為什么別人講的時候都是說,java的基本數(shù)據(jù)類型都是傳值派草,所有的自定義數(shù)據(jù)(類的對象)都是傳引用搀缠??
很簡單,因為這樣好理解近迁,意思是說:“同學們艺普,如果我們把一個基本數(shù)據(jù)類型的值(變量)傳遞給一個函數(shù)的形參,那么無論我們對這個變量怎么操作鉴竭,函數(shù)運行完之后歧譬,并不會改變這個變量的值!(到這里都是對的)但是如果我們把一個類的實例(對象)作為參數(shù)傳遞給函數(shù)搏存,那么我們在函數(shù)里面對這個對象的改變瑰步,會實際地改變這個對象的值!(這里就不完全正確了)”璧眠。
對于Java的對象與引用的理解缩焦,請參見:淺談Java中的對象和引用读虏。我這里簡單說一下Person person = new Person("張三"),這里面new Person("張三")是類Person的實例(或者說是對象)袁滥,person是這個實例(對象)的引用盖桥。
Java的參數(shù)傳遞都是值傳遞!L夥揩徊!
先貼一篇博文:理解Java中的引用傳遞和值傳遞,如果你覺得這個人講的很有道理嵌赠,那么你是麻瓜(哇塑荒!馬老師附體!)猾普。我先不解釋袜炕,去看下這篇博文的1樓評論!
我們先定義初家,什么是值傳遞偎窘,什么是引用傳遞。
值傳遞:方法調用時溜在,實際參數(shù)把它的值的副本傳遞給對應的形式參數(shù)陌知。特點:此時內存中存在兩個相等的基本類型,即實際參數(shù)和形式參數(shù)掖肋,后面方法中的操作都是對形參這個值的修改仆葡,不影響實際參數(shù)的值。
引用傳遞:方法調用時志笼,實際參數(shù)的引用(地址沿盅,而不是參數(shù)的值)被傳遞給方法中相對應的形式參數(shù),函數(shù)接收的是原始值的內存地址纫溃;特點:在方法執(zhí)行中腰涧,形參和實參內容相同,指向同一塊內存地址紊浩,方法執(zhí)行中對引用的操作將會影響到實際對象窖铡。
值傳遞實在是太簡單了,大家應該都容易理解坊谁,既然傳遞的是實際參數(shù)的副本费彼,那么更改這個副本,跟原來的變量沒有一點關系口芍。
但是對于引用傳遞箍铲,一般的支持引用的例子我也不說了△尥郑看一個稍微特殊的例子:如果我們把下面的例子理解為引用傳遞虹钮,輸出應該是: LI Si 才對聋庵!因為zhangsan這個(new Person("ZHANG San")的)引用指向了新的對象!但實際結果是zhangsan這個引用指向的對象的名字并沒有變芙粱!
1publicclass ValueOrRef { 2publicstaticvoid main(String[] args) { 3Person zhangsan =newPerson("ZHANG San"); 4? ? ? ? changePerson(zhangsan); 5? ? ? ? zhangsan.printName(); 6? ? } 7publicstaticvoid changePerson(Person person){ 8person =newPerson("LI Si"); 9? ? }10}1112class Person {13String name = "default";14public Person(String name) {15this.name = name;16? ? }17publicvoid changeName(String name){18this.name = name;19? ? }20void printName() {21System.out.println(this.name);22? ? }23}
所以這里,我們把這種傳遞也理解為”值傳遞“只不過這里的值氧映,是一個”引用”的值春畔!也就是我們把實際參數(shù)(一個引用)拷貝一份賦值給形式參數(shù),形式參數(shù)進行操作岛都。當形式參數(shù)對本身的對象進行了變動操作律姨,這里的效果跟引用傳遞是相同的。但是一旦給形式參數(shù)進行賦值類型的操作臼疫,這個賦值操作并不會像C語言的引用那樣择份,把這個賦值的效果反映在函數(shù)運行結束之后!烫堤!
總結:不要糾結與值傳遞與引用傳遞的概念了荣赶,我們明白函數(shù)執(zhí)行的過程就好了!為了更好地理解整個運行過程的變化鸽斟,請參考:Java:按值傳遞還是按引用傳遞詳細解說(其中有圖片演示拔创,很清楚)。