国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

理解Java賦值和參數傳遞機制

2019-11-18 15:26:59
字體:
來源:轉載
供稿:網友

  提綱:
1、版權聲明
2、前言
3、正文
4、結論
5、附注
6、參考資料

=======================================================

1、版權聲明:
  本文作者:little,原始出處:用"堆棧區數據復制"理解java賦值和參數傳遞機制的心得 (http://java.learndiary.com/disDiaryContentAction.do?goalID=2716),郵件:mdx-xx@tom.com。如有任何反饋意見請聯系作者,作者會在本文原始出處隨時更新此文。轉載及引用請保留此版權聲明,謝謝。

2、前言:
  關于Java的賦值和參數傳遞是按值(by value)進行的還是按引用(by reference)進行的,這個問題曾經迷惑了很多人,包括我。而且,我想,這個問題還將繼續迷惑一些人,包括那些C++的高手。
  在這里,我不預備用“按值(by value)”和“按引用(by value)”這樣的術語來闡述這個問題。因為,從字面的理解來看,這樣的術語在不同的人頭腦里有不同的含義。我試圖從Java數據(包括原始類型(PRimitive type)和對象(ojbect))在內存中的存儲這個角度,用一個自創的“術語”來闡述我對這個問題的理解。這個術語就是:“堆棧區數據復制(Stack Data Copy,簡稱SDC)”。具體一點就是:在Java中,不管是賦值操作還是參數傳遞操作--針對原始類型(primitive type),是對堆棧區的原始類型的值進行復制;針對對象,是對儲存在堆棧區的,對象的引用中所儲存的對象的值的地址進行復制。
  像上面摳字眼的句子讀起來比較費力,我在后面將用兩個例子并結合一些示意圖來闡述我對這個問題的理解。希望各位朋友幫助糾正錯誤。

3、正文:
1)、賦值操作:
例子源碼:(Assign.java)
  1. public class Assign{
  2.   public static void main(String[] args){
  3.     int i = 1;
  4.     Object o = new Object();
  5.     System.out.println("i = " + i + " ; o = " + o ); // Step 1 (示意圖:3-1-1)
  6.     int j = i;   
  7.     Object p = o;
  8.     System.out.println("i = " + i + " ; j = " + j + " ; o = " + o + " ; p = " + p); //Step 2 (示意圖:3-1-2)
  9.     j++;
  10.     p = new Object();
  11.     System.out.println("i = " + i + " ; j = " + j + " ; o = " + o + " ; p = " + p); //Step 3 (示意圖:3-1-3)
  12.   }
  13. }


對上面例子的說明:
(1),Step 1中,整數i和對象o得到賦值。

示意圖3-1-1

理解Java賦值和參數傳遞機制(圖一) 

從示意圖3-1-1中可以看出:整數i存儲在堆棧區(Stack);對象o的引用存儲在了堆棧區,但是對象o的值卻存儲在了內存堆中(Heap),對象o的引用存儲了對象o的地址。
Step 1在我的機器上的一次輸出結果:
  1. i = 1 ; o = java.lang.Object@a90653



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天柱县| 昭觉县| 宣化县| 安化县| 翼城县| 中宁县| 聊城市| 深圳市| 积石山| 岗巴县| 康乐县| 峨眉山市| 土默特右旗| 新巴尔虎左旗| 寿阳县| 额尔古纳市| 高邑县| 洛川县| 茂名市| 蒙城县| 图木舒克市| 通化县| 东光县| 塔河县| 宁陵县| 高陵县| 盘山县| 女性| 彩票| 辽中县| 泰来县| 精河县| 龙岩市| 正蓝旗| 威海市| 荥阳市| 堆龙德庆县| 淮滨县| 苍溪县| 固安县| 侯马市|