簡體   English   中英

Java中的指針和引用變量有什么區別?

[英]What is the difference between a pointer and a reference variable in Java?

我的 Java 書解釋說要使用對象,我們可以將它們分配給引用變量。 這與指向對象的指針有何不同? Java 有指針嗎?

謝謝 :)

引用有點像指針,您無法對其進行算術運算……盡管它更不透明。 雖然底層位可能是虛擬內存中的地址,但它們不一定是。 它們只是獲取對象(或表示空值)的一種方式。 因此,雖然它們並不完全相同,但如果您習慣於將指針視為“識別對象或導航到對象的一種方式”(在某種意義上),那么是的,這些想法也適用於引用。

Java 本身沒有指針(與 C# 不同,C# 具有引用指針——后者在“不安全”代碼中使用)。

術語“引用”和“指針”基本上是等價的。 我看過的很多關於 Java 基礎的文獻都聲稱 Java 沒有指針。 但是,如果您嘗試使用null引用,則會得到NullPointerException 所以這都是語義。

(真正的區別在於,在 C 或 C++ 中,術語“指針”嚴格表示恰好是某些數據的內存地址的整數。而在 Java 中,術語“引用”更接近於 C++“引用”概念。您可以即使您願意,也不能直接使用內存地址,但您可以以相同的方式使用它。)

Cat x = new Cat();

這一行在內存中創建了一個 Cat 對象,並將對它的引用存儲在 x 中。

x 現在包含對 Cat 對象的引用,但如果您要這樣做:

x = x + 1;

這不會像在 C 中那樣給出下一個內存地址,但會給出編譯器錯誤。 Java 不允許控制引用或內存位置。

如果我們將引用或指針視為訪問或處理內存中對象的一種方式,它們大同小異。 但是,它們在實現方面是不同的。 以下是差異:

  1. 指針支持指針運算,這使得它們有點不安全。 因為它們為程序員提供了遠遠超出需要的訪問級別。 但是,引用通過更抽象的隱藏實現提供對象的句柄。

  2. 指針不是強類型的,而引用是強類型的。 我的意思是代碼在引用的情況下非常簡單,而在指針的情況下則稍微不那么正式。 您需要利用 reinterpret_cast 類型的東西來使用指針轉換,另一方面,引用支持“C”中原始類型轉換的簡單轉換。

  3. 指針是不安全的,而引用是安全的。 如果您在兩個選擇參考之間有一個選項。 在像 C# 這樣的語言中,你有這種自由。

  4. C/C++ 中存在指針,Java 中存在引用。 不要將 C/C++ 中的引用與 Java 中的引用混淆。 C/C++ 中的引用是 C/C++ 中用於指針右值的同義詞。

不,Java 沒有指針。 Java 中的基本概念是“值”與“引用”。

引用是一個指針,你通常看不到它的(即內存地址)。 唯一允許的操作是設置它(從另一個引用)並通過它引用被引用的對象。 它可以從引用值表達式(例如new運算符)或另一個引用(在語法上是一個簡單的引用值表達式)中設置。

就 Java 語法而言——確實,Java 沒有指針,但為了澄清情況——Java 運行時指針。 每次GC發生時,存儲在堆中的對象很有可能會物理改變它的內存地址。 這只能通過使用真正稱為Pointer 的東西來實現。 當您來自C++世界時 - 您知道引用限制。 但這並不意味着 JVM 不使用引用 =)。

有關更多信息,請查看普通對象指針

因此,由於您對核心 JVM 內存管理有一個簡要的了解,您可以將Java 參考術語視為運行時的指針

不,根本沒有通過引用傳遞 僅按值傳遞,因為真正的 Java 方法參數是Java Reference的副本,因此 - 另一個Pointer

因此,在語法使用方式上 - Java Reference更接近C++ Reference ,但在實際運行時世界中它接近Pointer

Ps 要獲得更多說明,最好閱讀更多關於普通對象指針的文章或在oop.hpp 上搜一下

因為 Java 不支持指針。 看起來引用是一種特殊的指針。 但我們必須注意關鍵的區別:使用指針,我們可以指向任何地址(實際上是內存中的一個數字槽)。 因此,很可能使用指針,我們也可以指向無效地址,然后我們可能會在運行時遇到意外問題。 但是引用類型將始終指向有效地址,或者它們將指向 null。

指針只包含地址,但引用不包含地址,如果我們坦率地說,對象的地址被分配給索引,或者我們說可以散列代碼和大小寫代碼給引用變量,如果我們將看到引用變量的內容它以類 Name @ 開頭,然后是一些十六進制代碼。 這些編號不是地址,它是索引值或哈希碼。

第二點我們不能對值執行任何算術運算參考值的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM