对于基本类型,final使数值恒定不变。而对于对象引用,final使引用恒定不变。一旦引用别初始化指向一个对象,就无法再把改为指向另一个对象。然而对象自身却是可以修改的。Java没有提供使任何对象恒定不变的途径。这一限制同样使用数组,它也是对象。不能因为某数值是final的就认为在编译时可以知道他的值。在运行是使用随机生成的值来初始化就说明这一点。
java允许生成“空白final”是指被声明为final但又为给定初值的字段。无论什么情况,编译器都确保空白final在使用之前必须被初始化。必须在字段的定义处或者每个构造器中用表达式对final进行赋值,这正是final字段在使用钱总是被初始化的原因所在。
使用final方法的原因有两个:第一个原因是把方法锁定,以防止任何类修改它的含义。这是出于设计的考虑,想要确保在继承中使用方法行为保持不变,并且不会被覆盖。使用final方法的第二个原因是效率。如果将一个方法指明为final,就是同意编译器将针对该方法的调用都视为内嵌调用。
当将某个类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这样做。换句话说,出于某种考虑你对该类的设计不需要做任何变动,或者出于安全考虑,你不需要它有子类。
java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定。为什么要将某个方法声明为final呢?正如前面所说,它可以防止其他人覆盖该方法,但更重要的一点或许是:这样可以有效地“关闭”动态绑定,或者说是告诉编译器不需要进行动态绑定。
只有非private方法可以被覆盖,但是害死需要密切注意覆盖private方法的现象,这时虽然编译器不会报错误。但是也不会按照我们所期望的来执行。确切地说,在导出类中,对于基类中的private方法最好采用不同的名字