999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

JAVA語言中參數傳遞的深入剖析

2013-10-29 10:20:08陳蘭芹
湖北工程學院學報 2013年3期

李 冉,陳蘭芹

(荊楚理工學院 計算機工程學院,湖北 荊門448000)

Java語言中,參數傳遞機制對于初學者來說,一直是一個難點,也是一個重點。關于這方面的教材、論文和參考手冊很多,但是說法不一,有的模糊帶過。比如,有的認為Java的參數傳遞分兩種情況,即值傳遞和引用傳遞;有的認為Java中所有的參數傳遞都是按值傳遞。其實這些說法都有一定的合理性,但是沒有清晰地說明它的基本原理,容易讓初學者陷入邏輯漩渦。本文參閱了各種說法,并結合了JDK的幫助文檔,首先從Java的變量內存分配機制開始,全面深入地剖析Java語言中參數傳遞機制,并得出最合理的結論。

1 Java中變量的內存分配機制

Java的內存分配機制很復雜,這里只分析Java的變量內存分配規則,以助于理解Java的參數傳遞機制,而不考慮它在堆區、棧區還是靜態數據區,也不考慮生命周期。

1.1 Java的數據類型

Java的數據類型分為兩大類,分別是基本數據類型和引用數據類型[1]。基本數據類型,也稱為簡單數據類型,包括byte、char、short、int、long、float、double和boolean共8種;引用數據類型也稱為復雜數據類型,包括接口、類和數組共3種。

1.2 變量及其內存分配規則

JVM根據變量的數據類型來分配內存空間,Java中不同大類型的變量內存分配規則不同。

1)對于基本數據類型

JVM對于基本數據類型的變量,只分配一定大小的內存單元,用于存儲該變量的值。如果復制該變量,則是復制該內存單元的值,例如:

double x=7.3;//定義了雙精度類型變量x,并賦初值為7.3

double y=x;//定義了雙精度類型變量y,并copy了x的值

對應的內存單元示意圖見圖1。

圖1 基本數據類型變量內存分配圖

x變量的值復制給了y變量,此時,x、y是兩個值相同的但是完全獨立的兩個內存單元。

2)對于引用數據類型

JVM對于引用數據類型的變量,也是分配一定大小的內存單元,用于存儲該變量所指向的對象,該變量的值為對象的引用。如果復制該變量,實際上是復制了該變量內存單元的值,而不是復制它所指的對象的值,例如:

Point p1=new Point(23,34);//Point為Java中一個已有的類

Point p2=p1;//將p1的值復制給了p2變量對應的內存單元示意圖見圖2。

圖2 引用數據類型變量內存分配圖

p1變量的值復制給了p2變量,此時p1與p2存放的值是同一個對象的引用,即指向同一個對象,但是它們是兩個完全獨立的內存單元。

對于p1和它所指向的對象,本質上也是兩個完全不同的內存單元。

2 Java參數傳遞機制

在Java語言中,參數傳遞是在程序運行過程中,實際參數將參數值傳遞給被調用的方法中相應的形式參數,然后實現對數據處理,或者完成特定的功能。實際參數是調用過程中,從主調方法傳遞給被調用方法的值,它可以是常量、變量或者表達式;形式參數是被調用方法用于接收并存儲實際參數值的變量[2]。

Java語言中,參數傳遞的機制只有一個,即將實際參數的值復制一份賦值給形式參數,形式參數值的任何變化,不會影響到實參的值。實際參數可以是常量、變量或者表達式,變量又有很多種類型,但是都遵循這個機制。

2.1 實際參數為常量或者表達式的參數傳遞

Java語言中,常量和表達式都有值的屬性,在參數傳遞中,將常量的值或者表達式計算的值復制一份賦值給形式參數。在方法內部,形式參數的值發生任何改變,不會影響到實際參數的值。實際上,常量和表達式的值不允許修改,也不可能修改。

2.2 實際參數為基本類型變量的參數傳遞

實際參數為基本類型變量時,參數傳遞過程中,將實參變量的值復制一份賦值給形式參數。實參變量和形參變量是兩個獨立的內存單元,形參變量的值發生任何變化,不會影響到實參變量的值,如下例程很好地驗證這種傳遞邏輯關系。

運行結果如下:

在fun方法中,形參d的初始值,d=12.3

在fun方法中,形參d的初始值,d=15.3

在main方法中,實參f在fun方法執行之后的值,f=12.3

執行過程如圖3所示。

圖3 實參為簡單類型變量的參數傳遞執行過程示意圖

2.3 實際參數為引用類型變量的參數傳遞

實際參數為引用類型變量時,參數傳遞不是實參變量所指向的對象的值,而是實參變量本身的值,即所指對象的引用。傳遞的實現就是將實參變量所存儲的引用的值復制一份賦值給形參變量,形參變量的內存單元也存儲了該對象的引用值。但是形參變量與實參變量是兩個獨立的存儲單元,形參變量內存單元值的變化不會影響到實參變量。如下例程很好地驗證了這種邏輯關系。

運行結果如下:

圖4 實參為引用類型變量的參數傳遞執行過程示意圖

由圖3和圖4可以看出,引用類型實參到形參的參數傳遞,與簡單類型實參到形參的傳遞方式一樣,都是值的復制,只不過被復制的值的含義不同而已。

3 總結

在Java語言中,參數傳遞的機制本質上就是值的復制,即只是從實際參數到形式參數變量的值的復制。也可以說,在Java中,參數傳遞都是按值傳遞的,就像快遞公司送包裹一樣,不關心包裹的內容是什么。一些文章或者書籍中,將參數傳遞分為按值傳遞和按引用傳遞,是考慮了參數值的意義,這與Java參數傳遞的實現機制是沒有關系的。初學者只要搞清楚了Java中變量類型分類和內存分配機制,就能靈活地使用參數傳遞機制。

[1]埃克爾.Java編程思想[M].陳昊鵬,譯.4版.北京:機械工業出版社,2007.

[2]昊斯特曼.Java核心技術:卷I[M].葉乃文,鄺勁筠,杜永萍,譯.北京:機械工業出版社,2008.

主站蜘蛛池模板: 97久久精品人人| 国产成人在线小视频| 亚洲视频一区在线| 真人高潮娇喘嗯啊在线观看| 久久无码av三级| 国产电话自拍伊人| 欧美精品H在线播放| 无码免费视频| 久久国产黑丝袜视频| 亚洲国产成熟视频在线多多| 91精品人妻互换| 久久久久久久蜜桃| 亚洲国产系列| 久操中文在线| 久久亚洲AⅤ无码精品午夜麻豆| 国产女人18水真多毛片18精品| 91国内外精品自在线播放| 国产啪在线91| 亚洲制服中文字幕一区二区| 播五月综合| h视频在线播放| 国产女人水多毛片18| 午夜a视频| 一级毛片在线播放免费观看| 制服丝袜亚洲| 99精品热视频这里只有精品7| 欧美性天天| 国产迷奸在线看| 午夜性刺激在线观看免费| 国产欧美日韩综合在线第一| 好紧太爽了视频免费无码| 97视频在线精品国自产拍| 亚洲免费播放| 不卡国产视频第一页| 国产最爽的乱婬视频国语对白| 亚洲男人在线| 激情综合婷婷丁香五月尤物| 亚洲资源站av无码网址| 一级毛片无毒不卡直接观看| 2021国产在线视频| 欧美日韩在线亚洲国产人| 欧美天天干| 国产精品成| 亚洲综合18p| 中国一级特黄大片在线观看| 深夜福利视频一区二区| 日本国产在线| 天堂av高清一区二区三区| 国产精品丝袜在线| 成人免费一级片| 日本在线免费网站| 在线无码av一区二区三区| 久久久久亚洲AV成人人电影软件| 亚洲色中色| 国产亚洲欧美在线中文bt天堂| 免费国产黄线在线观看| 区国产精品搜索视频| 久久香蕉国产线看精品| 国产老女人精品免费视频| 首页亚洲国产丝袜长腿综合| 免费不卡在线观看av| 精品国产污污免费网站| 亚洲第一香蕉视频| 久久鸭综合久久国产| 久久亚洲国产视频| 国产亚卅精品无码| 91系列在线观看| 内射人妻无套中出无码| 国产精品午夜福利麻豆| 国产精品免费电影| 日韩a级毛片| 国产玖玖视频| 婷婷久久综合九色综合88| 高清不卡一区二区三区香蕉| 久久亚洲日本不卡一区二区| 国产高清在线观看| 久久中文无码精品| 青青草原国产精品啪啪视频| 国产95在线 | 国产成人无码久久久久毛片| 国产成人无码综合亚洲日韩不卡| 日韩天堂网|