摘要:而且棧內(nèi)存一般使用的是一級,讀寫速度快。堆內(nèi)存主要存放由創(chuàng)建的對象和數(shù)組,垃圾回收器回收這部分內(nèi)容。所以雖然值傳遞復(fù)制的是棧內(nèi)的原值,但表現(xiàn)出來的特性仍然是趨向于引用傳遞因?yàn)槟銖?fù)制一個(gè)引用的原值,并沒有卵用。
今天下午一直在看一些常見的Java試題,看到很多問題都涉及到Java參數(shù)傳遞的問題,之前自己也是一知半解,雖然知道是值傳遞,但沒有辦法通俗易懂的講出個(gè)所以然來,所以特地查一些資料并且記錄下來今天的理解。
首先,Java的內(nèi)存分配分為三種:棧內(nèi)存、堆內(nèi)存、方法區(qū)內(nèi)存。
1.棧內(nèi)存:主要存放函數(shù)中定義的基本類型變量,對象的引用。在程序運(yùn)行到跳出變量作用域后Java會自動釋放內(nèi)存。使用棧的好處是在于,棧的先進(jìn)后出的性質(zhì)符合程序中函數(shù)調(diào)用運(yùn)行特點(diǎn),即后調(diào)用先返回,這樣就可以盡快釋放不用到的內(nèi)存空間。而且棧內(nèi)存一般使用的是一級cache,讀寫速度快。
2.堆內(nèi)存:主要存放由new創(chuàng)建的對象和數(shù)組,Java垃圾回收器回收這部分內(nèi)容。使用堆結(jié)構(gòu)的意義,我推測是在于易于控制(垃圾回收的時(shí)候總是回收最久沒有使用的空間,而堆可以很快的取出結(jié)構(gòu)中最大或最小的值)。
3.方法區(qū)內(nèi)存:主要存放類信息和static變量。這里穿插一個(gè)小知識點(diǎn):在每次類被加載的時(shí)候,總是先執(zhí)行static屬性的定義,以及static語句的執(zhí)行。
好,說完內(nèi)存就可以清晰的解釋Java參數(shù)傳遞了。
1.Java只用值傳遞
2.值傳遞時(shí)只復(fù)制了棧內(nèi)存的內(nèi)容
3.對于基本類型對象, 棧內(nèi)存中留有的是原值,所以參數(shù)傳遞時(shí),值傳遞將原值復(fù)制一份到調(diào)用函數(shù)內(nèi)
4.對于復(fù)雜對象(new出來的對象,通過單例模式獲得的對象我認(rèn)為也算是new出來的對象,或者說是原值在堆內(nèi)存中的對象),棧內(nèi)只存有的是一個(gè)指向堆內(nèi)值得引用。所以雖然值傳遞復(fù)制的是棧內(nèi)的“原值”,但表現(xiàn)出來的特性仍然是趨向于引用傳遞(因?yàn)槟銖?fù)制一個(gè)引用的原值,并沒有卵用)。
總之,傳參數(shù)時(shí),如果參數(shù)是基本類型,那在調(diào)用之后原值不會被改變;如果參數(shù)是復(fù)雜類型,在調(diào)用后參數(shù)會改變。
參考資料是知乎的一個(gè)問題下的眾多答案:
https://www.zhihu.com/questio...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65108.html
摘要:字節(jié)碼驗(yàn)證于是就寫了以下的類,用來驗(yàn)證然后,然后,看字節(jié)碼如下圖。以上,就是整個(gè)關(guān)于引用傳遞和值傳遞的理解,有說的不對的,望指正。 寫這個(gè)的原因主要是今天看到了知乎的一個(gè)問題,發(fā)現(xiàn)自己有些地方有點(diǎn)懵逼,寫下來記錄一下,知乎上排名第一的答案說的很清楚,不過看了以后依舊有點(diǎn)迷迷糊糊,所以自己寫了個(gè)幾行代碼測試。首先上一個(gè),感覺比較對的結(jié)論:**Horstmann的《java核心技術(shù)》(中文...
摘要:接下了,我們調(diào)用方法,來嘗試改變的值以此驗(yàn)證中的傳值方式。我們將作為實(shí)參傳給方法,形參來接受這個(gè)實(shí)參,在這里就體現(xiàn)出了兩種傳參方式的不同。中只有值傳遞這一種方式,只不過對于引用類型來說,傳遞的參數(shù)是對象的引用罷了。 前言 這幾天在整理java基礎(chǔ)知識方面的內(nèi)容,對于值傳遞還不是特別理解,于是查閱了一些資料和網(wǎng)上相關(guān)博客,自己進(jìn)行了歸納總結(jié),最后將其整理成了一篇博客。 值傳遞 值傳遞是指...
摘要:下面是一些常見的理解性問題,每一個(gè)問題盡量用圖或代碼去描述。內(nèi)容全部來自,包括基本語法數(shù)組集合類泛型面向?qū)ο罄厥债惓?刂戚斎胼敵龊蛢?nèi)存。不斷更新,歡迎大家提出有趣味的問題和意見。 程序員經(jīng)常可以通過搜索或者記憶來完成代碼,但是許多時(shí)候并不真正理解為什么那樣寫。也就是說,有一定經(jīng)驗(yàn)的程序員不會犯一些低級的語法錯(cuò)誤,但是因?yàn)椴簧钊肜斫庥锌赡茉斐梢恍└呒夊e(cuò)誤,比如說運(yùn)行無效率,代碼難De...
摘要:一基礎(chǔ)接口的意義百度規(guī)范擴(kuò)展回調(diào)抽象類的意義想不想通過一線互聯(lián)網(wǎng)公司面試文檔整理為電子書掘金簡介谷歌求職記我花了八個(gè)月準(zhǔn)備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對象深入分析 Java 中實(shí)例變量和類變量的區(qū)別 - 掘金原創(chuàng)文章,轉(zhuǎn)載請務(wù)必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪問我的站點(diǎn),閱讀更多有深度的文章。 實(shí)例變量 和 類變量...
摘要:每個(gè)棧幀中包括局部變量表用來存儲方法中的局部變量非靜態(tài)變量函數(shù)形參。操作數(shù)棧虛擬機(jī)的解釋執(zhí)行引擎被稱為基于棧的執(zhí)行引擎,其中所指的棧就是指操作數(shù)棧。指向運(yùn)行時(shí)常量池的引用存儲程序執(zhí)行時(shí)可能用到常量的引用。 本篇文章轉(zhuǎn)自微信公眾號:Java后端技術(shù) 學(xué)過Java基礎(chǔ)的人都知道:值傳遞和引用傳遞是初次接觸Java時(shí)的一個(gè)難點(diǎn),有時(shí)候記得了語法卻記不得怎么實(shí)際運(yùn)用,有時(shí)候會的了運(yùn)用卻解釋不出...
閱讀 1721·2021-11-22 15:33
閱讀 2097·2021-10-08 10:04
閱讀 3549·2021-08-27 13:12
閱讀 3425·2019-08-30 13:06
閱讀 1474·2019-08-29 16:43
閱讀 1399·2019-08-29 16:40
閱讀 790·2019-08-29 16:15
閱讀 2749·2019-08-29 14:13