Java Final vs C++ Const
Java的Final看起来和C/C++的Const有几分相似,但又有很多不同,看了这篇文章后总结如下,Final有三种主要用法:
修饰变量:variable
final变量是不可改变的,但它的值可以在运行时刻初始化,也可以在编译时刻初始化,甚至可以放在构造函数中初始化,而不必在声明的时候初始化,所以下面的语句均合法:
- final int i = 1; // 编译时刻
- final int i2 = (int)(Math.Random() * 10); //运行时刻
- final int i3; //构造函数里再初始化
而如果修饰类对象,并不表示这个对象不可更改,而是表示这个这个变量不可再赋成其它对象,这就比较象 C++的 Class const * p了。
final Value v = new Value(); v = new Value(); //不允许! v.some_method(); //允许
final经常和static一起用,这种用法类似C++的常量,在Java中很常见,比如 static final i = 10; 但这里同样也是允许运行时刻初始化的。
修饰方法:method
修饰方法时,final和C++的const就差别太大了,final表示一个Java函数不可更改,也就是不能被重载了,而不是修饰返回值的,所以private方法自动就是final的了(它们不会被重载)。
带来的一个附带的好处就是,final方法可以被编译器优化,比如内联什么的,也就是说final的方法可能效率会高一些(仅仅是可能,具体取决于编译器)。
修饰类:class
这个可以从final修饰方法引申开去,就表示整个类不能被继承了, 自然,里面的所有方法也相当于被加了final。
总之,final和const差别较大,还好Java换了一个关键字来做这些,否则会晕倒一批C++用户的,不过Java似乎保留了const这个字,不知留作什么用。
相关文章
April 2nd, 2008 at 8:52 am
Javascript有类似const的用法吗?
April 2nd, 2008 at 10:59 pm
大部分语言都支持const的,Javascript不是很确认,没用过,不过google上看到有。
December 8th, 2008 at 3:08 pm
“这就比较象 C++的 Class const * p了。”
C++中的“Class const * p”表示p这个指针可以改变,而p的内容不能改变;
所以JAVA中的final应该跟C++中"Class * const p"类似。
"Class * const p"表示p这个指针不能改变,而p的内容可以改变。
December 8th, 2008 at 3:09 pm
随便BS下回复这么麻烦~~~~