簡體   English   中英

Java final String,C ++等價物。 我的理解是否正確?

[英]Java final String, C++ equivalent. Is my understanding correct?

所以我偶然發現了以下Java代碼:

final String osName = System.getProperty("os.name");

我在其他幾個StackOverFlow問題中讀過String類實際上是不可變的。 所以我問自己以下的事情,為什么String聲明為final?

我對C ++不是很了解,但是為了理解幕后發生的事情(在Java中),我決定看看C ++中的等價物是什么。

如果我的理解是正確的,那么使Java中的String final與使C ++中的指針成為const是等價的,那就是指針變量所指向的是無法改變的。 Java中的限制是你只能改變指向該String的指針的常量,但指針指向的內存量是不可變的。

所以我的問題是我是正確的還是我錯過了其他的東西?

當我們說Java String是不可變的時,是因為String對象一旦創建就無法修改。 相反,當您要修改String引用時, 必須創建(並分配對新String的引用)。 當您將String變量標記為final您還要使引用不可變。

你的假設是正確的。 字符串是不可變的,但沒有最終聲明,指針不能更改。 因此,如果您想“更改”String變量,您可以這樣做,但它實際上不會更改對象,它將創建一個新對象並將指針指向新對象。 添加final會使它無法執行此操作,它不會讓您更改指針引用,並且它指向的String對象是不可變的,因此您無法更改最終的String。

Java在很多方面都有所不同。

在Java中,你永遠不能在創建后改變String的內容 - 它是不可變的 Java引用本質上也等同於C ++指針。 但是在C ++中你可以改變std::string的內容,除非它被聲明為const

把它放在一起:

String s = "stuff"; // Java
const std::string* s = new std::string("stuff"); // C++

現在用Java創建Java引用final意味着您不能將引用更改為指向不同的String 這相當於在C ++中使用指針const:

final String s = "stuff"; // Java
const std::string* const s = new std::string("stuff"); // C++

此外,Jave自動為其String管理內存。 這可以用C ++粗略地近似。

像這樣:

String s = "stuff"; // Java
std::shared_ptr<const std::string> s =
    std::make_shared<const std::string>("stuff"); // C++

final String s = "stuff"; // Java
const std::shared_ptr<const std::string> s =
    std::make_shared<const std::string>("stuff"); // C++

暫無
暫無

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

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