轉:Java對象及對象引用變數

来源:http://www.cnblogs.com/Jocelyn66/archive/2017/06/28/7088789.html
-Advertisement-
Play Games

Java對象及其引用 關於對象與引用之間的一些基本概念。 初學Java時,在很長一段時間里,總覺得基本概念很模糊。後來才知道,在許多Java書中,把對象和對象的引用混為一談。可是,如果我分不清對象與對象引用, 那實在沒法很好地理解下麵的面向對象技術。把自己的一點認識寫下來,或許能讓初學Java的朋友 ...


Java對象及其引用

關於對象與引用之間的一些基本概念。

       初學Java時,在很長一段時間里,總覺得基本概念很模糊。後來才知道,在許多Java書中,把對象和對象的引用混為一談。可是,如果我分不清對象與對象引用,

       那實在沒法很好地理解下麵的面向對象技術。把自己的一點認識寫下來,或許能讓初學Java的朋友們少走一點彎路。

       為便於說明,我們先定義一個簡單的類:

       class Vehicle {

       int passengers;      

       int fuelcap;

       int mpg;

                   }

有了這個模板,就可以用它來創建對象:

       Vehicle veh1 = new Vehicle();

通常把這條語句的動作稱之為創建一個對象,其實,它包含了四個動作。

1)右邊的“new Vehicle”,是以Vehicle類為模板,在堆空間里創建一個Vehicle類對象(也簡稱為Vehicle對象)。

2)末尾的()意味著,在對象創建後,立即調用Vehicle類的構造函數,對剛生成的對象進行初始化。構造函數是肯定有的。如果你沒寫,Java會給你補上一個預設的構造函數。

3)左邊的“Vehicle veh 1”創建了一個Vehicle類引用變數。所謂Vehicle類引用,就是以後可以用來指向Vehicle對象的對象引用。

4)“=”操作符使對象引用指向剛創建的那個Vehicle對象。

我們可以把這條語句拆成兩部分:

Vehicle veh1;

veh1 = new Vehicle();

效果是一樣的。這樣寫,就比較清楚了,有兩個實體:一是對象引用變數,一是對象本身。

       在堆空間里創建的實體,與在數據段以及棧空間里創建的實體不同。儘管它們也是確確實實存在的實體,但是,我們看不見,也摸不著。不僅如此,

       我們仔細研究一下第二句,找找剛創建的對象叫什麼名字?有人說,它叫“Vehicle”。不對,“Vehicle”是類(對象的創建模板)的名字。

       一個Vehicle類可以據此創建出無數個對象,這些對象不可能全叫“Vehicle”。

       對象連名都沒有,沒法直接訪問它。我們只能通過對象引用來間接訪問對象。

       為了形象地說明對象、引用及它們之間的關係,可以做一個或許不很妥當的比喻。對象好比是一隻很大的氣球,大到我們抓不住它。引用變數是一根繩, 可以用來系汽球。

       如果只執行了第一條語句,還沒執行第二條,此時創建的引用變數veh1還沒指向任何一個對象,它的值是null。引用變數可以指向某個對象,或者為null。

       它是一根繩,一根還沒有繫上任何一個汽球的繩。執行了第二句後,一隻新汽球做出來了,並被系在veh1這根繩上。我們抓住這根繩,就等於抓住了那隻汽球。

       再來一句:

       Vehicle veh2;

就又做了一根繩,還沒繫上汽球。如果再加一句:

       veh2 = veh1;

繫上了。這裡,發生了複製行為。但是,要說明的是,對象本身並沒有被覆制,被覆制的只是對象引用。結果是,veh2也指向了veh1所指向的對象。兩根繩系的是同一隻汽球。

       如果用下句再創建一個對象:

veh2 = new Vehicle();

則引用變數veh2改指向第二個對象。

       從以上敘述再推演下去,我們可以獲得以下結論:

(1)一個對象引用可以指向0個或1個對象(一根繩子可以不系汽球,也可以系一個汽球);

(2)一個對象可以有N個引用指向它(可以有N條繩子系住一個汽球)。

       如果再來下麵語句:

       veh1 = veh2;

按上面的推斷,veh1也指向了第二個對象。這個沒問題。問題是第一個對象呢?沒有一條繩子系住它,它飛了。多數書里說,它被Java的垃圾回收機制回收了。

這不確切。正確地說,它已成為垃圾回收機制的處理對象。至於什麼時候真正被回收,那要看垃圾回收機制的心情了。

       由此看來,下麵的語句應該不合法吧?至少是沒用的吧?

new Vehicle();

不對。它是合法的,而且可用的。譬如,如果我們僅僅為了列印而生成一個對象,就不需要用引用變數來系住它。最常見的就是列印字元串:

    System.out.println(“I am Java!”);

字元串對象“I am Java!”在列印後即被丟棄。有人把這種對象稱之為臨時對象。

       對象與引用的關係將持續到對象回收

Java在運行時才處理別名引用


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

-Advertisement-
Play Games
更多相關文章
  • 在ASP.NET MVC中來實現主題的切換一般有兩種方式,一種是通過切換皮膚的css和js引用,一種就是通過重寫視圖引擎。通過重寫視圖引擎的方式更加靈活,因為我不僅可以在不同主題下麵佈局和樣式不一樣,還可以讓不同的主題下麵顯示的數據條目不一致,就是說可以在某些主題下麵添加一下個性化的東西。 本篇我將 ...
  • 本文版權歸博客園和作者吳雙本人共同所有 轉載和爬蟲請註明原文地址 www.cnblogs.com/tdws 一.寫在前面 適配器模式(Adapter) 可用來在現有介面和不相容的類之間進行適配。有助於避免大規模改寫現有客戶代碼,其工作機制是對現有類的介面進行包裝,這樣客戶程式就能使用這個並非為其量身 ...
  • 寫在前面整個項目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp這一節內容可能會用到的庫文件有 Geometry 和 Commercial,同樣在 Github 上可以找到。善用 Ctrl + F ... ...
  • 引言 Postman 是一個用來測試Web API的Chrome 外掛軟體,可由google store 免費取得並安裝於Chrome里,對於有在開發Web API的開發者相當有用,省掉不少寫測試頁面呼叫的工作,通常我們看到的使用情境多數是直接呼叫Web API而未隨著Request發送相關所需參數 ...
  • 一、Chart(Winform) 使用圖表控制項(chart)首先要理解圖表區域(ChartArea)、XY軸(AxisX、AxisY)、數據點(Series)、標題(Title)、圖例(Legend)這幾個之間的層次關係。 圖1:柱形圖 從圖1可以中內容,可以對Chart控制項的組成有了一個簡單的瞭解 ...
  • 古人雲:溫故而知新。這是極好的,近來,作為一個小白,利用點空閑時間把之前幾個月自己寫過的一個作為練手的一個OA系統又重新拿來溫習一番,希望在鞏固基礎之上能得到新的啟示。現在回想起來,之前一個人,寫寫停停,不覺感嘆,平時工作中團隊的重要性以及個人力量的渺小。因為是練手的項目,整個系統從資料庫到前端都是 ...
  • 上一篇講了從創建應用程式域到創建ISAPIRuntime實例的過程,本篇繼續講Asp.net處理第一次請求的必要的初始化過程。 ISAPIRuntime分析 ISAPIRuntime在System.Web.Hosting中實現,它的ProcessRequest是我們處理web請求的入口。 註意方法的 ...
  • Entity Framework支持的查詢方式有三種 LINQ to Entities Entity SQL Native SQL 【LINQ to Entities】 LINQ(語言集成查詢)是從Visual Studio 2008開始引入的功能,在C 中可以使用LINQ查詢不同的數據源。LINQ ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...