Java中的引用和指針

来源:http://www.cnblogs.com/gameoverit/archive/2016/02/03/5178844.html
-Advertisement-
Play Games

java中記憶體的分配方式有兩種,一種是在堆中分配,一種是在堆棧中分配,所有new出來的對象都是在堆中分配的,函數中參數的傳遞是在棧中分配的。通常情況下堆的記憶體可以很大,比如32位操作系統中的虛擬記憶體都可以被堆所使用(當記憶體緊張的時候甚至硬碟都可以是堆的存儲空間),而堆棧的記憶體分配是有限的。 這和c+


java中記憶體的分配方式有兩種,一種是在堆中分配,一種是在堆棧中分配,所有new出來的對象都是在堆中分配的,函數中參數的傳遞是在棧中分配的。通常情況下堆的記憶體可以很大,比如32位操作系統中的虛擬記憶體都可以被堆所使用(當記憶體緊張的時候甚至硬碟都可以是堆的存儲空間),而堆棧的記憶體分配是有限的。

這和c++中記憶體分配差不多。java中有幾種基本類型如int,float,double,char,byte等,他們不是對象,除此之外一切都是對象,所有的對象都是在堆上分配的。但好像在C#中這些都有封裝好的一些方法,應該算是對象。

java中對象數組是什麼,和c++類似,是句柄數組或者叫指針數組,裡面保存的是每個元素的地址。和c++中不同,java沒有操作符重載和拷貝構造函數(如果不瞭解這些也沒有關係),因此當創建對象或者對已經創建的對象賦值時(註意是對象,不是基本類型):Object a=new Object 和Object a=b(b是Object的子類型或者同類型)時,進行的是對象地址的傳遞並複製。這就是所說的句柄的傳遞和賦值

句柄里存儲的就是對象的地址,句柄就是指針,只不過是你無法得到的地址,java就是通過這一點巧妙的將指針隱藏起來。當對象作為參數傳遞到方法中時,傳遞的就是對象的地址,而行參中保存的是實參地址的副本(這就是最關鍵的地方,也是值傳遞,值傳遞就是將實參的值的副本作為行參)

如:

public class Example{

int i=0;

}

 

public class A{

public int i=0;

public Example add0(Example e)

{

e.i++;

return e;

}

public void add1(Example e)

{

e.i++;

}

public void modify0(Example e)

{

Example b=e;//將e行參對象的地址賦給句柄b

b.i++;//也同時修改了e.i和實參的值

}

public void modify1(Example e)

{

e=new Example();

e.i++;

}

public static void main(String[] args)

{

Example ex=new Example();

A a=new A();

a=a.add0(ex);//等價於a.add0(ex),無需返回值,因為通過傳遞的對象地址(句柄),直接修改了ex中i的值

a.add1(ex);//add0,add1都在其中的方法體中直接修改了ex.i的值,因此add0的返回值有點多餘

a.modify0(ex);//對ex所產生的影響同add1

a.modify1(ex);//對ex沒有產生任何影響(而且這就是等價於什麼也沒有做).

這可能會讓一部分人搞不清了。為什麼呢?因為是對象地址的副本"值傳遞",在modify1中e=new Example();實際上e僅僅是保存ex對象地址的副本的一個句柄,當對e賦值時僅僅是對堆棧中e的賦值(對ex指針副本的變數e賦值),而並沒有改變ex的句柄的指向,當方法調用完畢堆棧彈出,e就將要被垃圾回收,沒有任何用處。當然你可以將它作為返回值,這就是另外一回事了。

}

}

如果你能明白這個原理,可以避免一些潛在的邏輯錯誤,如:對象在方法中被改動了,記住c++在這一點上和java有很大的不同,c++預設的是值傳遞,行參會按照位複製實參(如果用指針或者引用就和java很類似了),在方法中作為參數傳遞對象,java更象是c++中傳遞引用,當然還是有區別的,那就是c++中對象的引用不可再賦值為另一個對象。

本文為轉載! 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JSON字元串的最上一層,肯定是一個JSONObject,JSONObject的下一層,可以包含JSONArray,JSONArray又包含了若幹個JSONObject。用例子來說明: package myJson; import net.sf.json.JSONArray; import net.
  • EXTENDED LIGHTS OUT 題意:給一個5*6的01矩陣,對一個位置操作(0->1開燈或者1->0關燈)會影響到(包括自己)周邊燈狀態反轉。問最後要使得所有的燈關掉的操作矩陣(1表示該位置的燈操作了) 提示:01矩陣,題目給了說是操作兩次就相當於沒操作,但是還有隱含的意思就是這就是一個異
  • 用eclipse創建一個WebService應用非常方便,步驟如下: 1.安裝WebService插件。www.eclipse.org網站上有下載,我下載的是wtp-all-in-one-sdk-R-1.5.4-win32,裡面就包括了。(我下載了好像沒什麼用,估計就跟之前安裝的Eclipse是同一
  • C介面與設計,需要註意的流程還是比較多的. 從演算法設計到演算法測試,到基礎庫封裝, 到基礎庫測試,後面是投入生產, 和框架融合再測試. 等等,都特別的耗時間, 今天分享的 是一個關於二叉樹基庫的封裝測試.下一個版本投入到生產環節.
  • 用單引號代替雙引號來包含字元串,這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變數,單引號則不會,註意:只有echo能這麼做,它是一種可以把多個字元串當作參數的“函數”(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)。 1、如果能將類的方法定義成static
  • python中的range函數表示一個連續的有序序列,range使用起來很方便,因為在定義時就隱含了初始化過程,因為只需要給begin()和end()或者僅僅一個end(),就能表示一個連續的序列。還可以指定序列產生的步長,如range(0,10,8)產生的序列為[0, 8], 預設的步長為1,ra
  • 查詢資料有以下兩種方法: 1、 <#if appMap?exists> <#list appMap?keys as key> key:${key} value:${appMap.get(key)} </#list> </#if> 2、 <#list testMap.keySet() as testK
  • C++學習計劃 一、課程概況 1.課程名稱:c++遠征攻略 2.授課人姓名:james_yuan 3.課程鏈接地址: 二、課程列表 1.全部的課程 由於我有了一些c語言的基礎,所以我跳過了遠征前準備的課程直接進入了遠征起航的課程。 2.遠征起航的課程 這部分有兩部分: 第一部分的課程: 第二部分的課
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...