千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)
一、Java中的值傳遞和引用傳遞區(qū)別

1、值傳遞會(huì)創(chuàng)建副本,而引用傳遞不創(chuàng)建副本;
2、值傳遞中函數(shù)中無法改變原始對(duì)象,而引用傳遞中函數(shù)中可以改變原始對(duì)象。值傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù);而引用傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址直接傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。
值傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)。
引用傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址直接傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。
無論是值傳遞還是引用傳遞,其實(shí)都是一種求值策略(Evaluation strategy)。在求值策略中,還有一種叫做按共享傳遞。其實(shí)Java中的參數(shù)傳遞嚴(yán)格意義上說應(yīng)該是按共享傳遞。
按共享傳遞,是指在調(diào)用函數(shù)時(shí),傳遞給函數(shù)的是實(shí)參的地址的拷貝(如果實(shí)參在棧中,則直接拷貝該值)。在函數(shù)內(nèi)部對(duì)參數(shù)進(jìn)行操作時(shí),需要先拷貝的地址尋找到具體的值,再進(jìn)行操作。如果該值在棧中,那么因?yàn)槭侵苯涌截惖闹担院瘮?shù)內(nèi)部對(duì)參數(shù)進(jìn)行操作不會(huì)對(duì)外部變量產(chǎn)生影響。如果原來拷貝的是原值在堆中的地址,那么需要先根據(jù)該地址找到堆中對(duì)應(yīng)的位置,再進(jìn)行操作。因?yàn)閭鬟f的是地址的拷貝所以函數(shù)內(nèi)對(duì)值的操作對(duì)外部變量是可見的。
簡單點(diǎn)說,Java中的傳遞,是值傳遞,而這個(gè)值,實(shí)際上是對(duì)象的引用。
而按共享傳遞其實(shí)只是按值傳遞的一個(gè)特例罷了。所以我們可以說Java的傳遞是按共享傳遞,或者說Java中的傳遞是值傳遞。
所以函數(shù)內(nèi)部對(duì)參數(shù)進(jìn)行操作不會(huì)對(duì)外部變量產(chǎn)生影響。如果原來拷貝的是原值在堆中的地址,那么需要先根據(jù)該地址找到堆中對(duì)應(yīng)的位置,再進(jìn)行操作。因?yàn)閭鬟f的是地址的拷貝所以函數(shù)內(nèi)對(duì)值的操作對(duì)外部變量是可見的。
簡單點(diǎn)說,Java中的傳遞,是值傳遞,而這個(gè)值,實(shí)際上是對(duì)象的引用。
而按共享傳遞其實(shí)只是按值傳遞的一個(gè)特例罷了。所以我們可以說Java的傳遞是按共享傳遞,或者說Java中的傳遞是值傳遞。
延伸閱讀:
二、java接口的修飾符
(1)接口用于描述系統(tǒng)對(duì)外提供的所有服務(wù),因此接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們;
(2)接口僅僅描述系統(tǒng)能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;
(3)接口不涉及和任何具體實(shí)例相關(guān)的細(xì)節(jié),因此接口沒有構(gòu)造方法,不能被實(shí)例化,沒有實(shí)例變量,只有靜態(tài)(static)變量;
(4)接口的中的變量是所有實(shí)現(xiàn)類共有的,既然共有,肯定是不變的東西,因?yàn)樽兓臇|西也不能夠算共有。所以變量是不可變(final)類型,也就是常量了。
(5) 接口中不可以定義變量?如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行為來修改屬性。有的人會(huì)說了,沒有關(guān)系,可以通過 實(shí)現(xiàn)接口的對(duì)象的行為來修改接口中的屬性。這當(dāng)然沒有問題,但是考慮這樣的情況。如果接口 A 中有一個(gè)public 訪問權(quán)限的靜態(tài)變量 a。按照 Java 的語義,我們可以不通過實(shí)現(xiàn)接口的對(duì)象來訪問變量 a,通過 A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類中是可以這樣做的,那么實(shí)現(xiàn)接口 A 的所有對(duì)象也都會(huì)自動(dòng)擁有這一改變后的 a 的值了,也就是說一個(gè)地方改變了 a,所有這些對(duì)象中 a 的值也都跟著變了。這和抽象類有什么區(qū)別呢,怎么體現(xiàn)接口更高的抽象級(jí)別呢,怎么體現(xiàn)接口提供的統(tǒng)一的協(xié)議呢,那還要接口這種抽象來做什么呢?所以接口中 不能出現(xiàn)變量,如果有變量,就和接口提供的統(tǒng)一的抽象這種思想是抵觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實(shí)現(xiàn)接口的對(duì)象提供一個(gè)統(tǒng) 一的屬性。
通俗的講,你認(rèn)為是要變化的東西,就放在你自己的實(shí)現(xiàn)中,不能放在接口中去,接口只是對(duì)一類事物的屬性和行為更高層次的抽象。對(duì)修改關(guān)閉,對(duì)擴(kuò)展(不同的實(shí)現(xiàn) implements)開放,接口是對(duì)開閉原則的一種體現(xiàn)。
相關(guān)推薦