最近在寫(xiě)代碼的過(guò)程中弥虐,逐漸體會(huì)到模塊化扩灯、對(duì)象化、結(jié)構(gòu)化霜瘪、獨(dú)立化對(duì)于整個(gè)項(xiàng)目工程是多么重要和迫切的一件事珠插。
保持邏輯的清晰,保證各個(gè)模塊靈活可拆卸颖对,提升工程的解耦能力捻撑,拒絕臃腫,避免模塊內(nèi)部的強(qiáng)關(guān)聯(lián)缤底,真的很優(yōu)雅顾患。
結(jié)構(gòu)構(gòu)成了系統(tǒng)的骨骼,數(shù)據(jù)在不同對(duì)象个唧,不同組件江解,不同模塊之間傳遞,像血液一樣流動(dòng)起來(lái)徙歼,這樣系統(tǒng)才能活動(dòng)起來(lái)膘流。然而,不同的編程語(yǔ)言之間鲁沥,對(duì)于數(shù)據(jù)的傳遞也有這自己的方式呼股,對(duì)于開(kāi)發(fā)者而言可能就會(huì)造成疑惑。查了一些資料画恰,下面我想總結(jié)一下彭谁。
值傳遞
值傳遞有這樣的特點(diǎn):實(shí)際上傳遞進(jìn)方法或者對(duì)象實(shí)例的是要傳遞內(nèi)容(基礎(chǔ)類型變量或者對(duì)象的引用)的副本,因此允扇,在方法或者實(shí)例內(nèi)部改變傳遞進(jìn)來(lái)的值缠局,對(duì)于外部是不可見(jiàn)的,并不會(huì)造成什么影響
對(duì)于Java來(lái)說(shuō)考润,從本質(zhì)上來(lái)講狭园,所有的傳遞都是值傳遞
public static void main(String [] args){
Dog myDog = new Dog("Rover"); //---1
foo(myDog); //---2
}
public void foo(Dog someDog) {
someDog.setName("Max"); //---3
someDog = new Dog("Fifi"); //---4
someDog.setName("Rowlf"); //---5
}
說(shuō)明
myDog變量在內(nèi)存中占有空間,這段空間中有指向一個(gè)Dog實(shí)例或者說(shuō)Dog對(duì)象的指針糊治。
在傳遞過(guò)程中唱矛,myDog這個(gè)內(nèi)存中的值被拷貝然后傳遞到方法中,并賦值到someDog井辜,此時(shí)myDog和someDog這兩個(gè)內(nèi)存空間的值都有指向同一個(gè)Dog實(shí)例绎谦,因此此時(shí)均可以修改Dog實(shí)例的屬性。
當(dāng)給someDog賦值新的Dog對(duì)象粥脚,改變的只是someDog變量的值窃肠,也就是someDog所占內(nèi)存空間的值,指向了一個(gè)新的Dog對(duì)象刷允,對(duì)myDog并沒(méi)有任何影響冤留。
引用傳遞
引用傳遞的特點(diǎn)是:這里的引用碧囊,相當(dāng)于一個(gè)別名,所以纤怒,傳遞到方法或者對(duì)象中呕臂,對(duì)該變量的修改在外部是可見(jiàn)的。就像在某個(gè)qq群中肪跋,名字叫張三,同一個(gè)qq號(hào)土砂,現(xiàn)在又進(jìn)了另外一個(gè)qq群州既,起名李四,然而商虐,不管是張三還是李四肯适,本質(zhì)上來(lái)說(shuō)杜耙,指向的是同一個(gè)qq號(hào)。
在C++中存在引用傳遞蚌卤。不太熟悉C++,這里不細(xì)說(shuō)奥秆。
共享傳遞(Call by sharing)
在JavaScript中看到這個(gè)概念逊彭。
維基百科上說(shuō):
However, the term "call by sharing" is not in common use; the terminology is inconsistent across different sources. For example, in the Java community, they say that Java is call by value.
可見(jiàn),這跟java中的值傳遞是同一個(gè)概念构订。