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这个字,不知留作什么用。

相关文章


4 Responses to “Java Final vs C++ Const”

Leave a Reply