Java最终字符串,C++;相等的我的理解正确吗?
因此,我偶然发现了以下一段Java代码:Java最终字符串,C++;相等的我的理解正确吗?,java,c++,string,Java,C++,String,因此,我偶然发现了以下一段Java代码: final String osName = System.getProperty("os.name"); 我在其他几个StackOverFlow问题中读到,String类实际上是不可变的。所以我问自己,为什么字符串被声明为final 我对C++不太好,但是为了理解幕后发生的事情(在爪哇),我决定看看C++中的等价物。 如果我的理解正确,在java中用string结尾的字符串与C++中的指针一样是const,这就是指针变量指向不能改变的。Java中的限制
final String osName = System.getProperty("os.name");
我在其他几个StackOverFlow问题中读到,String类实际上是不可变的。所以我问自己,为什么字符串被声明为final
<>我对C++不太好,但是为了理解幕后发生的事情(在爪哇),我决定看看C++中的等价物。
如果我的理解正确,在java中用string结尾的字符串与C++中的指针一样是const,这就是指针变量指向不能改变的。Java中的限制是,您只能更改指向该字符串的指针的常量,但指针指向的内存是不可变的
所以我的问题是我是对的还是我遗漏了什么?当我们说Java字符串是不可变的时,这是因为字符串对象一旦创建就不能修改。相反,当您要修改字符串引用时,必须创建(并为其分配引用)新字符串。当您将字符串变量标记为
final
时,您还使引用不可变。您的假设是正确的。字符串是不可变的,但如果没有最终声明,则无法更改指针。因此,如果您想“更改”字符串变量,您可以这样做,但它实际上不会更改对象,它将创建一个新对象并将指针指向新对象。添加final使其成为不可更改的指针引用,并且它指向的字符串对象是不可更改的,因此无法更改final字符串。Java在许多方面有所不同
在Java中,您永远不能在创建后更改字符串的内容-它是不可变的。java引用基本上也等价于C++指针。但是在C++中,<>强>可以< /强>更改<代码> STD::String >,除非它声明为代码> const .<
把它们放在一起:
String s = "stuff"; // Java
const std::string* s = new std::string("stuff"); // C++
String s = "stuff"; // Java
std::shared_ptr<const std::string> s =
std::make_shared<const std::string>("stuff"); // C++
现在,在Java中创建Java引用final
,意味着您不能将引用更改为指向不同的字符串。这相当于在C++中设置指针常量:
final String s = "stuff"; // Java
const std::string* const s = new std::string("stuff"); // C++
此外,Jave还自动管理其字符串的内存。在C++中可以大致近似。
像这样:
String s = "stuff"; // Java
const std::string* s = new std::string("stuff"); // C++
String s = "stuff"; // Java
std::shared_ptr<const std::string> s =
std::make_shared<const std::string>("stuff"); // C++
String s=“stuff”//JAVA
std::共享的=
std::使_共享(“东西”);//C++
及
final String s=“stuff”//JAVA
const std::共享的=
std::使_共享(“东西”);//C++
初始化后无法将其分配给。因此,不可修改的常量可以使用public static final
。使引用也不可变会有什么影响?@Ogen您也不能将新的字符串对象分配给字符串引用(当它是final时)。就这样。