之所以写这个实在是有感于C++ 中const的和java中final的有某些类似的情况
初学java的人肯定有这种困惑,final作用于基础类型时的确是不可变的,但作用于对象引用时,却发现只能确保这个引用不能指向其他对象,当然从语义上来看的确没问题,在java中创建不可变对象是一个复杂的过程(参考String类的实现),然后在C++中创建一个不可变对象却非常容易,不可变对象在很多方面有着优势(安全等)。下面就讲讲这两个关键词的异同点。
指向const对象的指针和引用
//指向const对象的指针
const Test t(10);
const Test *p = &t;
p->a = 12// error 假设Test 类有a属性
//const 引用
const int &p = 1;
p = 2;//error
指向const对象的指针和引用确保了不能通过这个指针或者引用修改对象。
const 类型的指针
int a = 1;
int b = 2;
int *const p1 = &1;
int *p2 = &b;
p1 = p2 //error
*p1 = 3;//ok
指向const 对象的 const 指针
const int i = 3;
const int * const p = &i;
指向const 对象的 const 指针 能够保证不能通过改指针修改对象和修改指针指向。
java 中的final 引用
final Test a = new Test(3);
a.a = 4;
不难看出 在java的final引用跟C++中的const指针效果上是一样的。
总结
通过以上的分析我们可以看到在java相比C++少了一种场景,比如某个对象实际是可变的,我们需要限制其他用户对他做出改变,在c++ 可以传递const 指针 或者const 引用,而在java中并不存在现成的机制去确保我们通过引用无法修改一个可变对象。(好久没看c++了,如果有什么问题欢迎大家指出)
网友评论