final关键字:通常是指无法改变的。
final可能使用到的三种情况:数据、方法和类。
一、final数据
- 一个永远不改变的编译时常量。
- 一个在运行是被初始化的值,而且你不希望对他做出任何改变。
对于编期常量这种情况,编译器可以将该常量值带入任何可能用到它的计算式中,也就是说,在编译时执行算式,这样一来就减轻了运行时的负担。在Java中,这类常量必须是基本数据类型,并且以关键字final表示。对该常量进行定义的时候必须赋值。
当final修饰的是对象的引用时,final会使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它再指向另一个对象,然而对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径。
一个既是static又是final的域只占据一段不能改变的存储空间。
class Value{
int i;
public Value(int i) {
this.i = i;//1
}
}
public class FianlData {
private static Random random = new Random(47);
private String id;
public FianlData(String id) {
this.id = id;//为类中的id赋值
}
private final int valueOne = 9;
private static final int VALUE_TWO = 99;
public static final int VALUE_THREE = 39;
private final int i4 = random.nextInt(20);
static final int INT_5 = random.nextInt(20);
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);//2
private final int[] a = {1,2,3,4,5,6};
public String toString() {
return id+": "+"i4 = "+i4+", INT_5 = "+INT_5;
}
public static void main(String[] args) {
FianlData fd1 = new FianlData("fd1");//
fd1.v2.i++;
fd1.v1 = new Value(9);
for (int i = 0; i < fd1.a.length; i++) {
fd1.a[i]++;
}
System.out.println(fd1);
System.out.println("............................................................");
FianlData fd2 = new FianlData("fd2");
System.out.println(fd1);
System.out.println(fd2);
}
}
fd1: i4 = 15, INT_5 = 18
............................................................
fd1: i4 = 15, INT_5 = 18
fd2: i4 = 13, INT_5 = 18
二、final方法
final方法不能被重写
三、final所修饰的类
final所修饰的类是不能被继承,不能有子类
四、final所修饰的变量:
final所修饰的变量,是不可修改的,是常量。
常量:
* 字面值常量:1,2,3
* 自定义常量:被final所修饰的成员变量,一旦初始化则不可改变
注意:自定义常量必须初始化,可以选择显示初始化或者构造初始化