final关键字

final数据

  • 对于基本类型,final使数值恒定不变
  • 对于对象引用,final一旦引用被初始化一个对象,就无法改变指向另一个对象。到那时对象其本身的值是可变的
关于staticfinal
  • static 主要是唯一性,final则是不可变
空白final

声明为final但又未给定

final参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Gimzo {
public void spin() {
}
}
class FinalArguments {
void with(final Gimzo gimzo){
//! g = new Gimzo(); // Illegal -- g is final
}
void without(Gimzo gimzo){
gimzo = new Gimzo();
gimzo.spin();
}
// void f(final int i) { i ++; } // can't change
int g(final int i) { return i + 1; }
}

public class Main{
public static void main(String[] args){
FinalArguments bf = new FinalArguments();
bf.without(null);
bf.with(null);
}
}
final方法

把方法锁定,防止任何继承类修改它的含义。

final

防止被继承

继承和初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Insect{
private int i = 9;
protected int j;
Insect(){
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
private static int x1 = printInt("static Insect.x1 initialized");
static int printInt(String s){
System.out.println(s);
return 47;
}
}

public class Beetle extends Insect{
private int k = printInt("Beetle.l initialized");
public Beetle(){
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2 = printInt("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
}
}

加载Beetle类的过程中,编译器注意到它有一个基类。不管是否打算产生于一个基类的对象,这都要发生。