final关键字
存在两种final的用法:
- 一个永远不会改变的编译时常量
- 一个在运行时被初始化的值,不希望被改变
对于编译器常量,编译器可以将常量值直接代入用到它的表达式中,减轻了运行时负担。但这类常量必须是基本数据类型,且必须对它进行赋值。例如:private final int VALUE = 99;
一个static final域会占据一段不能改变的存储空间。对于基本数据类型很好理解,数值恒定不变,但对于引用对象来说,只是恒定指向这个对象,但是对象内部的值却是可以修改的,对于数组也是同理。
空白final必须在使用之前在构造期内部进行初始化。Java允许在参数列表中以声明的方式将参数指定为final,这就代表无法在方法中更改参数引用所指向的对象。
使用final方法是为了把方法锁定,以防止任何继承类修改它的含义。
在Java类中的所有private方法都隐式地指定为final,因为无法使用private,所以自然而然没有办法覆盖它。覆写只有在方法是父类的接口的一部分时才会出现,即必须可以将一个对象向上转型为它的基类类型并且调用相同的方法。
如果将一个类的整体定义为final时,就表明不希望继承该类,同时禁止别人这样做。同时,对于该类的设计永远不需要做出变动。