final: 一段不可更改的存储单元,考虑以下场景:
1、一个永不改变的编译时常量。
2、一个在运行时被初始化的值,之后将不会改变。
一个既是static又是final是指该域只占据一段不能改变的存储单元。
引申:static和final 的区别。可以从功能出发点考虑: static 修饰的是一个域,表示只占据一个存储空间。其里面的值是可以随便修改的;而final强调的是存储单元的值恒定不变。一个修饰的是存储单元, 一个修饰的是存储的值
final 的应用:
(1) final 数据:
package com.company;
class Value {
int i;
public Value(int i) {
this.i = i;
}
public static class FinalValue {
private String id;
private final int valOne = 9;
private final int j; // 空白final
private static final int VAL_TWO = 19;
public static final int VAL_THREE = 29;
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
private final int a[] = {1, 2, 3, 4, 5};
public FinalValue(String id) {
// 空白final初始化
j=1;
this.id = id;
}
public static void main(String[] args) {
FinalValue fv1 = new FinalValue("fv1");
fv1.v2.i++;
fv1.v1 = new Value(9);
for(int i =0; i<fv1.a.length;i++){
fv1.a[i]++;
}
//fv1.valOne ++ ;
//fv1.v2 = new Value(9);
//fv1.VAL_3 = new Value(9);
//fv1.a = new int[3];
System.out.println(fv1);
System.out.println("create final value");
FinalValue fv2 = new FinalValue("fv2");
System.out.println(fv1);
System.out.println(fv2);
}
}
}
当final 修饰基本数据类型,引用和数组的时候,定义的时候必须先初始化,初始化后不可以重新初始化.
valone 和 VAL_TWO 都是带有编译时数值为final基本数据类型,可作为编译时常量. 修饰引用和数组的时候(数组名本质的该数组的引用名) .表示该引用名只可以指向初始化的域,不可以更改.所以不可以重新初始化.但里面的参数是可以随便赋值.
j 是空白final ,指声明为final类型但没有赋值, 空白final在使用前必须要初始化.
(2) final 参数
在方法中无法更改引用所指向的对象. 意味着只可以读取,不可以更改.
(3) final方法:
主要应用于该方法如果被final修改,表示该方法不可以被覆盖 . private修饰的方法隐式的表明该方法是final类型.
在继承中,即便是父子类方法名相同,但如果是final类型修饰的话,相当于生成一个方法,例如B 继承A, B 是不可以调用A 中final类型的方法.
(4)final 类.表示封装该类,不能被继承.