日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

為什么Java中只有值傳遞

瀏覽:101日期:2022-08-18 14:31:01
參數傳遞

在我們日常編寫代碼的過程中,調用函數可能是最常見的操作了。那么,在調用函數時,參數是怎么樣傳遞的呢?

值傳遞

相信有很多人都是學C語言入門的,剛開始寫代碼時,用的最多的就是值傳遞了。

void plus_one(int a){ a++; printf('a: %d', a);}int main(){ int n = 10; plus_one(n); printf('n:%d', n); return 0;}

這是一個簡單的值傳遞的例子,無需多言,plus_one函數的作用就是將傳進來的數加一,然后輸出。所謂值傳遞,就是直接將實參n的值賦給形參a,賦值完成之后,兩者再無瓜葛。

因此,上面的代碼可以等效為:

int main(){ int n = 10; // plus_one start int a; a = n; a++; printf('a: %d', a); // plus_one end printf('n:%d', n); return 0;}

可以看到,值傳遞簡單直觀,然而,調用函數并不能改變實參n的值。

指針傳遞

那么,當我們需要改變實參的值的時候,我們就會想到使用指針傳遞,也就是所謂的地址傳遞。

void plus_one(int* p){ *p = *p + 1;}int main(){ int n = 10; plus_one(&n); printf('The result is %d', n); return 0;}

這里,我們將實參n的地址傳入plus_one函數,在函數中,直接對指針p所指向的值,也就是n做操作,自然就可以改變實參n的值了。

實際上,指針傳遞也是值傳遞。我們將上面的代碼改寫:

int main(){ int n = 10; // plus_one start int* p; p = &n; *p = *p + 1; printf('The result is %d', n); // plus_one end return 0;}

可以看到,所謂的指針傳遞,也只不過是將變量n的地址值賦給指針變量p,實際上也是值傳遞。

所以,可以不負責任的概括為,C語言中只有值傳遞;

引用傳遞

指針固然強大,但是由于代碼不易讀,難以理解等問題,也是廣為詬病。C++作為C語言的超大杯,引入了引用傳遞來簡化指針傳遞的寫法。

void plus_one(int& a){ a++;}int main(){ int n; plus_one(n); printf('The result is %d', n); return 0;}

C++中,對&運算符進行了重載,實現了引用傳遞。具體實現為,在調用plus_one函數時,在函數調用棧中存變量n的地址,而不是n的值。因此,plus_one中的變量a就相當于是n的'別名',對a操作時,自然會改變n的值。

可見,引用傳遞的底層也是賦值操作。

Java中的參數傳遞

那么,在Java中,究竟是引用傳遞,還是值傳遞呢?

Java中變量分為基本變量和對象,我們不妨分別討論。

基本變量類型

首先,對于int、char等基本類型,Java是使用值傳遞的,很容易驗證。

static void plusOne(int a){ a++; System.out.println('a: ' + a);}public static void main(String[] args){ int n = 10; plusOne(n);System.out.println('n: ' + n);}

顯然,與C語言中一樣,這里n的值是不會改變的。

對象

public class PassObject { public static void main(String[] args) { Dog myDog = new Dog('Test'); foo(myDog); System.out.println(myDog.getName());// TestPlus } public static void foo(Dog dog) { dog.setName('TestPlus'); }}class Dog{ private String name; public Dog(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; }}

通過上面的例子可以看到,傳入對象的引用時,是可以改變對象的屬性變量的。那么Java在傳遞對象作為參數時,是引用傳遞嗎?

實際上并非如此,Java中,對象的引用,實際上相當于對象的指針。在Java中操作對象,只有通過引用操作這一種途徑。某種意義上,Java中是不能直接操作對象的。

也就是說,在上例中傳參時,沒有對myDog對象實例做任何操作,只是把myDog引用值賦給了foo函數中的本地變量dog。并沒有像引用傳遞一樣,傳入對象實體,但是只在棧中保存對象引用的操作。所以,Java中傳遞對象時,也是值傳遞。

所以,Java中只有值傳遞。

值得一提

然而,還是會有一些特殊情況,會讓人懷疑上述結論。

數組

上面只分析了基本變量類型和對象,數組呢?

實際上,Java中的數組也是一種對象,數組類也是繼承自Object類。在將數組作為參數時,也是傳遞的數組的引用,并沒有傳遞數組的實體。

public static void changeContent(int[] arr) { arr[0] = 10;}public static void changeRef(int[] arr) { arr = new int[2]; arr[0] = 15;}public static void main(String[] args) { int [] arr = new int[2]; arr[0] = 4; arr[1] = 5; changeContent(arr); System.out.println(arr[0]); // 10 changeRef(arr); System.out.println(arr[0]); // 10}

在上例中可以看到,將傳入的數組引用賦給一個新的數組后,這個引用就不能操作之前的數組了。

關于引用,英文是reference,實際上,我自認為,翻譯為句柄是更為貼切的,引用就像是一個柄,一個Handler,你可以用它操作實體,但他并不是實體本身。就像手柄可以操控游戲機,但不是游戲機本身,當你將這個手柄連接到另一個游戲機的時候, 它就不能操控之前的游戲機了。

包裝類和String

public static void main(String[] args) { Integer n = 1; plusOne(n); System.out.println(n); // 1}private static void plusOne(Integer n) { n = n + 1; System.out.println(n);// 2}

在這段代碼中,n作為Integer類型實例的句柄,卻并沒有成功改變對象的值,這是為什么呢?

在Integer類中,存對應值的屬性是value,其聲明如下:

private final int value;

可見,value值是不能改的,那加的操作是怎么實現的呢?

在上述加一的過程中,會重新new一個Integer對象,讓后將這個對象賦給引用n。這樣以來,之前的對象自然是不會改變的。

實際上,包裝類以及String類的值,都是final的,所以在執行+的過程中,都會重新生成一個對象,然后對它賦值。

以上就是為什么Java中只有值傳遞的詳細內容,更多關于Java 值傳遞的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美午夜精彩| 亚洲a在线视频| 黄色亚洲精品| 欧美中文一区二区| 蜜臀久久精品| 欧美日韩在线观看视频小说| 久久高清精品| 伊人成人在线视频| 亚洲人成网站在线在线观看| 亚洲va久久| 日韩国产一二三区| 久久国产欧美日韩精品| 国产精品视频3p| 日韩欧美网址| 国产精品婷婷| 亚洲精品a级片| 日韩一区二区三区高清在线观看| 日韩成人午夜精品| 日韩不卡一区| 91成人精品视频| 国产色99精品9i| 久久久国产精品一区二区中文| 丁香六月综合| 亚洲久久视频| 偷拍精品精品一区二区三区| 蜜臀av一区二区三区| 老司机免费视频一区二区| 国产主播一区| 国产精品亚洲综合久久| 久久要要av| 日韩精品国产欧美| 99久久99视频只有精品| 日韩avvvv在线播放| 136国产福利精品导航网址| 久久gogo国模啪啪裸体| 一区二区三区网站| 播放一区二区| 免费在线观看一区| 日韩精品一级| 久久不射中文字幕| 亚洲二区免费| 亚洲伊人av| 精品黄色一级片| 国产福利91精品一区二区| 日韩欧美高清一区二区三区| 精品国产欧美| 国产欧美自拍| 亚洲毛片一区| 免费日韩一区二区| 亚洲精品一区二区妖精| 欧美www视频在线观看| 中文字幕日韩亚洲| 日韩视频二区| 91九色精品国产一区二区| 日韩精品91| 激情亚洲影院在线观看| 国产传媒在线观看| 不卡专区在线| 亚洲黄色网址| 久久久蜜桃一区二区人| 欧美xxxx性| 精品视频一二| 国产日韩一区二区三区在线播放| 日本欧美在线看| 亚洲精品黄色| 免费观看在线综合| 国产精品av久久久久久麻豆网| 久久精品亚洲| 欧美日一区二区三区在线观看国产免| 亚洲aa在线| 国产精品网在线观看| 免费亚洲一区| 成人在线免费观看网站| 国产91在线精品| 亚洲不卡av不卡一区二区| 日韩a一区二区| 宅男在线一区| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲成人一区在线观看| 欧美理论视频| 四虎精品永久免费| 久久福利在线| 欧美精品黄色| 欧美精品中文| 国产中文一区| 欧美日韩亚洲一区三区| 成人国产精品久久| 午夜电影亚洲| 国产精品免费不| 精品日韩视频| 亚洲在线网站| 久久久久久久久成人| 在线视频亚洲| 麻豆国产欧美一区二区三区| 亚洲一级黄色| 欧美日韩视频免费看| 日韩在线高清| 国产精品天天看天天狠| 日韩高清不卡一区| 在线观看一区| 日本一二区不卡| 日韩中文字幕亚洲一区二区va在线| 国产精品探花在线观看| 一区二区亚洲精品| 国产精品蜜芽在线观看| 亚洲一区激情| 国产传媒av在线| 日韩av不卡在线观看| 99国产精品私拍| 日韩久久精品网| 麻豆精品久久久| 日本特黄久久久高潮| 99国产精品久久久久久久| 国产伦久视频在线观看| 国产欧美一级| 亚洲乱亚洲高清| 国产精品尤物| 亚洲国产一区二区在线观看 | 亚洲在线免费| 久久精品免费一区二区三区 | 亚洲免费婷婷| 国产精品久久久免费| 国产毛片一区| 99精品视频在线| 精品久久久中文字幕| 国产精品网在线观看| www.com.cn成人| 久久久久亚洲精品中文字幕| 国产亚洲欧美日韩在线观看一区二区| 噜噜噜久久亚洲精品国产品小说| 日韩视频一区| 亚洲一区二区成人| 午夜在线视频一区二区区别| 欧美性感美女一区二区| 欧美久久亚洲| 欧美精品黄色| 在线观看一区| 欧美亚洲三级| 国际精品欧美精品| 国内精品麻豆美女在线播放视频| 精品国产中文字幕第一页| 国产精品蜜月aⅴ在线| 国产高清视频一区二区| 裤袜国产欧美精品一区| 久久亚洲成人| 视频一区日韩精品| 日韩网站中文字幕| 午夜宅男久久久| 国产精品白丝一区二区三区| 精品三级av在线导航| 亚洲日本久久| 色偷偷色偷偷色偷偷在线视频| 91精品精品| 日韩美女精品| 精品国产美女a久久9999| 久久婷婷激情| 日韩成人一级| 1000部精品久久久久久久久| 日韩精品久久理论片| 精品丝袜在线| 国产精品一区二区av日韩在线| 日韩欧美视频专区| 欧美在线黄色| 美女毛片一区二区三区四区| 日本成人中文字幕| 亚洲伦乱视频| 国产精品综合色区在线观看| 亚洲午夜一级| 97精品一区| 日韩美女国产精品| 免费成人网www| 国产精品久久久久久久久免费高清 | 亚洲午夜在线| 国产99在线| 国产精品久久| 一二三区精品| 欧美特黄一级大片| 久久青青视频| 日韩av中文在线观看| 欧洲激情综合| 国产成人精品一区二区三区视频| 中文无码久久精品| 久久国产成人午夜av影院宅| 国产成人77亚洲精品www| 国产日产一区| 91精品国产自产观看在线| 久热re这里精品视频在线6| 电影亚洲精品噜噜在线观看| 国产精品手机在线播放| 日本综合精品一区| 久久国产精品亚洲77777| 91久久中文| 欧美特黄a级高清免费大片a级| 99免费精品| 亚洲天堂一区二区| 99久精品视频在线观看视频| 久久久天天操| 亚洲调教视频在线观看| 久久婷婷激情| 午夜亚洲一区|