Java Final 关键字 vs C++ 常量指针 vs C++ 引用

标签 java c++

在我看来,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.Stringjava.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/

相关文章:

java - Hibernate + MySQL - 如何获得不可猜测的生成 ID?

java - 如何使用 Java 8 流和过滤器过滤嵌套循环?

java - 在 Java 中打开 WIth 对话框

c++ - DirectX 设备大写字母

C++ - 字节数组到值的平台独立函数,反之亦然

Java - 从另一个 JDialog 获取 var 信息

java - 调用和使用 Java 方法时遇到问题

c++ - 优化循环并避免模板特化中的代码重复

c++ - 元运算符的优先级是什么...?

c++ - C++ 动态结构中的动态结构