final主要应用于三种情况:数据、方法和类。
一、final数据
许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的。有时数据的恒定不变是很有用的,比如:
1.一个永不改变的编译时常量。
2.一个在运行时被初始化的值,而你不希望它被改变。
在Java中,这类常量必须是基本数据类型,并且以关键字final表示。在对这个常量进行定义的时候,必须对其进行赋值。一个既是static有事final的域只占据一段不能改变的存储空间。当对对象应用而不是基本类型运用final时,其含义会有一点不一样。对于基本类型,final使数据恒定不变;而对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身确实可以被修改的,Java并未提供使任何对象恒定不变的途径。这个同样适用数组,它也是对象。注意,根据惯例,既是static又是final的域一般用大写表示,并使用下划线分隔各个单词。
二、final方法
使用final方法的原因是把方法锁定,以防止任何继承类修改它的含义。这是出设计的考虑:想要确保在继承中使方法行为保持不变,并且不会被覆盖。
final和private关键字
类中所有的private方法都隐式的指定为final的。由于无法取用private方法,所以也就无法覆盖它。可以对private方法添加final修饰词,但这并不能给该方法增加任何额外的意义。
三、final类
当将某各类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这么做。由于final类禁止继承。所以final类中所有的方法都隐式指定为final,因为无法覆盖它们。在final类中可以给方法添加final修饰词,但没有任何意义。