所以我偶然发现了以下Java代码:
final String osName = System.getProperty("os.name");
我在其他几个StackOverFlow问题中已经读过String类实际上是不可变的。所以我问自己以下的事情,为什么String声明为final?
我对C ++不是很了解,但是为了理解幕后发生的事情(在Java中),我决定看看C ++中的等价物。
如果我的理解是正确的,那么使Java中的String final与使C ++中的指针成为const是等价的,那就是指针变量指向的那个不能被改变。 Java中的限制是你只能改变指向该String的指针的常量,但指针所指向的内存量是不可变的。
所以我的问题是我是正确的还是我错过了其他的东西?
答案 0 :(得分:6)
当我们说Java String是不可变的时,是因为一旦创建了String对象就无法修改。相反,当您想要修改String引用时,必须创建(并分配对新String)的引用。将String变量标记为final
时,您还要使引用不可变。
答案 1 :(得分:4)
你的假设是正确的。字符串是不可变的,但没有最终声明,指针不能被更改。所以如果你想改变"您可以这样做的String变量但它实际上不会更改它将创建新对象的对象并将指针指向新对象。添加final使得你不能这样做它不会让你更改指针引用,它指向的String对象是不可变的,所以你不能改变最终的String。
答案 2 :(得分:0)
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
s管理内存。这可以用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++