[英]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.