程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 關於Java,那些我心存疑惑的事(不斷更新中...)

關於Java,那些我心存疑惑的事(不斷更新中...)

編輯:JAVA綜合教程

關於Java,那些我心存疑惑的事(不斷更新中...)


本文主要列出一些Java常用到確又讓大家不怎麼注意的問題。

將會不斷更新,歡迎關注……

如有覺得不合理之處,歡迎評論交流,沒有火花怎麼印象深刻?

(1)Java到底是值傳遞?還是引用傳遞?

揪出這個問題是因為有同學說開始寫博客了,於是他寫怎麼篇博客:Java到底是值傳遞?還是引用傳遞?,說讓我看看。

我看完覺得挺合理的,馬上給他回復說“不錯哦”。合理是合理,但是按照他的說法,那什麼不是傳值過去啊,都是值傳遞?

今天早上上班,來得比較早,就百度了一下這個問題,於是又看到了另外一篇文章:Java:按值傳遞還是按引用傳遞詳細解說,裡面評論是各種撕逼。還是沒有得到統一答案啊。

後面又看到另外一篇文章:Java中只有按值傳遞,沒有按引用傳遞!,以及該文章對應的評論。我也有了自己的看法。

對比這些博客以及對應的評論,“在Java裡面只有基本類型和按照下面這種定義方式的String是按值傳遞(就是直接使用雙引號定義字符串方式:String str = “小寶鴿”),其它的都是按引用傳遞。”好像有些道理。

java.lang.String的實例對象一旦創建,它包含的字符序列就不能被改變了。

String傳遞的也是引用副本的傳遞,但是因為String為final的,所以和按值傳遞等同的。

其實按值還是按引用的區別在於“是否在傳遞的時候進行對象的內存拷貝”,java中基本類型是由於在JVM中存儲區域不同於普通對象所以傳遞前會拷貝,傳遞的是拷貝後的值,但是對象在傳遞的時候不拷貝,直接傳“引用值”,指向同一片對象堆內存區域。(但是這這句話:其實按值還是按引用的區別在於“是否在傳遞的時候進行對象的內存拷貝”的正確性仍待考證)

後面,同學說了不應該通過比較幾篇博客文章就胡亂得出結論,誤人子弟。讓我十分惶恐……

後面有看到一些知乎的回答:java到底是值傳遞還是引用傳遞?。讓我又有了不一樣的理解。

不過,根據Horstmann的《java核心技術》(中文第8版P115-P117)的描述,java中是沒有引用傳遞的,原文摘錄如下:
”java程序設計語言總是采用值調用。也就是說,方法得到的是所有參數值的一個拷貝,特別是,方法不能修改傳遞給它的任何參數變量的內容。“

”有些程序員(甚至是本書的作者),認為java程序設計語言對對象采用的是引用調用,實際上這種理解是不對的。”

目前正在看深入Java虛擬機,待了深入了解了jvm的內存的分布結構,再寫篇博客給出詳細的解釋吧。也十分建議猿友們了解一下jvm的內存的分布結構。

如果猿友們有認真看我貼出的其他博主博客,拋開值傳遞和引用傳遞的概念,起碼知道了什麼樣的調用,得到什麼值。這就已經很不錯了。

通過這麼一番學習,一方面認識到了,寫博客嚴謹十分重要,免得誤人子弟。也深刻認識到自己對jvm的理解不足。另外方面,同上面的一些資料,閱讀過程中其實收獲還是挺大的, 起碼比一開始就給我一個結論“java程序設計語言總是采用值調用”的收獲還大些。


不斷更新中…….

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved