1、final类不能在派生子类。即:不能被继承。
plus:final类中的成员可以是final的也可以不是。但是其中的方法默认就是final的。这是很自然的,一个类不能被修改,其中的方法自然也不能被修改。
2、final方法不能被重写,但可以重载。
plus:JAVA中的final方法还有一个用处就是,它相当于c++中的内联函数,即在执行该方法时直接展开,而没有像调用普通方法那样内部繁琐的过程。由于当方法调用的消耗明显大于方法执行的消耗时,内联方法的优势才能体现出来。所以在java中会自动判断final方法的规模大小来决定是否将其视为内联方法。
3、final变量一经赋值就不能更改。可以用来定义常量:final int num=999;
public class ClassA {
final int i;
final int j=0;
public ClassA() {
i = 0;//未初始化成员final变量,必须在构造函数内赋值,且只能赋值一次。
}
void method1() {
final int k;
k = 0;//未初始化局部final变量,必须在方法内赋值,且只能赋值一次。
}
}
下面针对final成员变量,成员对象再来看一段代码(代码以注释为重,多余可以忽略。)
final对于基本数据类型的含义:数值恒定不变;对于对象类型的含义:引用恒定不变,而所指向的对象的内容可以改变。
class Value {
int i; // Package access
public Value(int i) { this.i = i; }
}
public class FinalData {
private static Random rand = new Random(47);
private String id;
public FinalData(String id) { this.id = id; }
private final int valueOne = 9;
private static final int VALUE_TWO = 99;//1、static final域只占据一段不能改变的存储空间。
public static final int VALUE_THREE = 39;
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);
private Value v1 = new Value(11);//指向对象的引用
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
// Arrays:
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) {
FinalData fd1 = new FinalData("fd1");
//! fd1.valueOne++; // Error: can't change value
fd1.v2.i++; // 引用所指向的对象可以改变
fd1.v1 = new Value(9); // 非final值
for(int i = 0; i < fd1.a.length; i++)
fd1.a[i]++; // Object isn't constant!
//! fd1.v2 = new Value(0); // final引用不能变
//! fd1.VAL_3 = new Value(1); // change reference
//! fd1.a = new int[3];//数组也被看做一个对象
System.out.println(fd1);
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
System.out.println(fd1);
System.out.println(fd2);
}
}
针对注释1:很好理解:static强调只有一份,final强调是一个常量。
注:对于参数,同样可以使用final关键字,性质相同。