作者: 曾祥旭 时间: 2013-3-25 08:12
我们先来看下面的程序:
class Outer{
public void function(){
final int num=9;
class Inner{
public void show(){
System.out.println(num);
}
}
Inner in=new Inner();
in.show();
}
}
public class Test{
public static void main(String[] args){
new Outer().function();
}
}
这是一个内部类,当内部类在局部位置上只能访问具备中被final修饰的局部变量,此时的变量就成为常量。
为什么呢?
理由:我们知道方法的局部变量位于栈上,只存在于该方法的生命期内。当一个function的方法结束,就会弹栈
局部变量就会消失。但是该方法结束之后,在方法内创建的内部类对象(用new创建的对象in)可能仍然存在于堆中!
例如,此时,如果我们对该对象进行引用,那么此时,show方法中的num就不存在,这时候,就会产生错误。因为
new的对象和num的生命周期不一样长。作者: 谷文仁 时间: 2013-3-25 09:06
将某个类的整体定义为final 时,该类无法被继承。而且由于final类禁止继承,所以final类中所有的方法都隐式指定为final的,因为无法覆盖它们。
final 用于类或方法是为了防止方法间的链接被破坏。例如,假定类 X 的某个方法的实现假设了方法 M 将以某种方式工作。将 X 或 M 声明成 final 将防止派生类以这种方式重新定义 M,从而导致 X 的工作不正常。尽管不用这些内部相关性来实现 X 可能会更好,但这不总是可行的,而且使用 final 可以防止今后这类不兼容的更改。