Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java最终字符串,C++;相等的我的理解正确吗?_Java_C++_String - Fatal编程技术网

Java最终字符串,C++;相等的我的理解正确吗?

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中的限制

因此,我偶然发现了以下一段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时)。就这样。