垃圾回收
与C++一样,Java也需要进行垃圾回收,但是它们之间是有不同之处的。C++允许你为一个类定义一个撤消函数(destructor ),它在对象正好出作用域之前被调用。Java不支持这个想法也不提供撤消函数。finalize() 方法只和撤消函数的功能接近。当你对Java 有丰富经验时,你将看到因为Java使用垃圾回收子系统,几乎没有必要使用撤消函数。
这里有三个要点值得注意:
(1).对象不一定会被回收
(2).垃圾回收不是析构函数
(3).垃圾回收只与内存有关
总而言之,垃圾回收和finalize() 并不一定会执行。也就是说,除非虚拟机真的到了没有内存运行的地步,否则它不会浪费时间进行垃圾回收以恢复内存。
final修饰符
final可以应用到数据、方法和类,下面逐一阐释。
final数据
将final应用到数据,无外乎2个原因:
1.创建一个编译时常量并且之后不再改变
2.创建一个运行时变量并且之后不再改变
第一种情况编译器会在编译时就进行内联,降低运行成本。此种情况在Java中必须是带final修饰符的基本数据类型,并且在创建时赋值。
被static和final同时修饰的变量只会拥有一块存储空间,它不会改变。
值得注意的是,当final修饰的是对象时,实际上是对指向该对象的引用进行限制,一旦初始化后,其不能被修改为指向其他对象,但是对象本身仍可以被修改。所以相比于修饰原始数据类型,使用final修饰对象显得不是很重要。
空白final
所谓空白final,即在创建时不赋值。这样极大地提高了final的灵活性,比如类中的每个对象都拥有含有不同值的final字段。但是要注意的是,因为final字段必须在使用前进行赋值,所以空白final字段必须在构造器中进行初始化操作。
final参数
方法中的参数也可以使用final修饰,代表着此参数在方法中不能改变它的引用。此种用法通常用于传递数据到匿名内部类中。
final方法
使用final修饰的方法意味着其不可被重写。通常,如果在设计上考虑不想让某个方法在子类中被修改,可以将它定义为final。
除此之外,final方法还有另一个优点是可以提高效率。在早期实现中,编译器会将所有final方法调用替换为内联调用,大大减少了系统开销。但在最近版本的Java中,JVM可以自动探测并优化内联机制,这使得人工标注优化点变得不再需要。现在已经不提倡使用final帮助优化器工作了,将效率问题全权交给编译器和JVM会是更好的选择。
总而言之,只在你想显式地指明方法不能被重写时使用final方法。
final与private
任何private方法都包含隐式的final,因为private不可被访问,自然也不可被重写。你可以为private方法加上final,但是这并不会为它赋予更多含义。
在此有一个奇怪的地方:如果你试图重写一个private方法,编译器不会报错,而且看起来也确实可行。之所以会发生这样的情况,其实是因为你实际上是在创建一个新方法,而不是重写一个旧方法。还记得“重写”的条件吗?只有父类接口中的方法可以重写。private方法不在接口中,相当于隐藏在类里面,只不过恰巧名字和你创建的方法一样。
final类
使用final修饰的类不可被继承,类中任何东西都不能被修改。类中字段可以是final也可以不是,但是所有方法都是隐式final的。
容器
relegate