在我看来,C++ 常量指针、C++ 引用和 Java final 关键字(变量上的 final)都是相同的东西,或者至少以相同的方式起作用。
它们阻止变量改变他的“指向地址”但内部值可以改变。
我这样想对吗?
如果不是,区别是什么?
关于c++部分
常量指针和引用有什么区别?
它们看起来像是做同一件事的不同方式,如果引用概念已经以常量指针的形式存在,为什么还要将引用概念添加到 C++ 中?
关于Java部分
有没有办法(在 Java 中)模拟指向 C++ 常量值的指针的相同行为?基本上有没有办法使值保持不变?
更类似于 const Shape* s = new Shape;
编辑:我找到了至少 1 个引入引用概念的理由
当我们定义一个复制构造函数时,我们需要将对象作为参数获取并且没有引用,我们将得到一个无限循环
C++:
class Shape{
public:
int member = 3;
};
Shape s1;
Shape s2;
Shape* const cp_var_1 = &s1;
cp_var_1->member = 5; // valid
cp_var_1 = &s2; //not valid
Shape& ref_var_2 = s1;
ref_var_2.member = 6; // valid - s1 changed as well
// cant change ref_var_2 to reference other variable (like s2)
ref_var_2 = s2;
// assignment operator called - s1 and s2 content are the same
// but ref_var_2 still reference s1
Java:
class Shape{
public int member = 3;
}
Shape s1 = new Shape();
Shape s2 = new Shape();
final Shape final_var_3 = s1;
final_var_3.member = 7; // valid
final_var_3 = s2; // not valid
最佳答案
是的,您完全正确:在 final var_3 = s1;
中,final
阻止您使 var_3
引用任何其他内容,但是您可以取消引用该变量并对在那里找到的内容执行任何您想做的事情:var_3.member = 7;
因此有效(点是取消引用运算符)。
请注意,java 中的final
关键字用于不同的目的。您可以将类标记为最终类,这意味着它们不能被扩展。 (class Foo extends SomeClassMarkedFinal {}
不会编译)。 final
也可以应用于方法:在这种情况下,这意味着任何子类都不能覆盖此方法。虽然英文名称 final
似乎是所有这些行为的好术语,但 final
用于变量声明,而 final
作为用在方法和类上,否则完全不相关。
许多 java 类型(例如 java.lang.String
、java.lang.Integer
等等)都是所谓的“不可变”:这些对象具有绝对没有办法改变他们的任何事情。 java 的字符串是对象(不是 ersatz char 数组),你不能访问底层的 char 数组,没有 clear()
或 setChar()
方法等:因此,字符串类型的最终变量是完全常量。
在这个意义上,Java(目前)没有提供任何方法来将类型标记为“常量”,将其添加为一个概念可能没有多大意义。例如,在 java 中,表示文件路径的 java.io.File
是不可变的:它绝对没有方法来改变其任何状态。
然而,它是不可变的吗?它是“恒定的”吗?如果我运行 file.delete(),我可以最确定地观察到变化,即使对象本身(只有一个字段,字符串类型,包含文件路径)根本没有改变。
关于Java Final 关键字 vs C++ 常量指针 vs C++ 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55663806/