final成员变量——不能被改变
static final 修饰的变量是编译时变量,它只能是基本数据类型,由于final变量必须在使用前进行初始化,所以必须在定义时赋值(不new新对象时,不会调用构造器,所以在构造器中赋值就会失效,所以必须在定义时赋值),编译时变量会在编译时被带入计算式(如果可能的话是这样,但是变量如果是由其他方法产生,比如说随机生成,这就要在运行时才能知道变量的值);编译时变量在内存中只占据一段不可更改的存储空间。
final成员变量:有几个对象,就会有几个final成员变量,但每个对象中的final成员变量是不可以更改的。
static fianl:只有一个(因为是static的),不可更改。
fianl修饰对象时,引用不可变,对象可变。
空白final
- 空白fianl:被声明为fianl但未给定初始值的域(没有static修饰哦!static final必须在定义时初始化)
public class BlankFinal {
private final int i = 0;
private final int j;//空白final
private final int OtherClass other;//空白final
public BlankFinal() {
j = 1; //初始化空白final
ohter = new OtherClass(); //初始化空白final
}
}
- 空白fianl需要在域外或者构造器中初始化,因为final域必须在使用前进行初始化。
final参数
- 方法中的final参数,不能在方法中更改它们的值。
//int f(final int i){return i++;} //错误! 改变了i本身的值
int f(final int i){return i + 1;} //正确! i的值没有被改变
final方法——不能被覆盖
使用final方法的原因:
- 将方法锁定,不允许子类重写此方法
- 提高效率(内嵌调用),但是现在不通过这个方法来提高效率了
声明为private的方法隐式的被指定为final的,因为不能被访问,也就不能被覆盖了。如果子类中有一个与基类private方法同名的方法,那它是一个新方法,并没有对private方法进行重写。
final类——不能被继承
- final类中的方法隐式的被指定为final的(因为final类不能被继承,也就不能对它的方法进行重写)
- final类中的成员变量可以自定义权限