final
数据
- 对于基本类型,
final
使数值恒定不变
- 对于对象引用,
final
一旦引用被初始化一个对象,就无法改变指向另一个对象。到那时对象其本身的值是可变的
关于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){ } void without(Gimzo gimzo){ gimzo = new Gimzo(); gimzo.spin(); } 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
类的过程中,编译器注意到它有一个基类。不管是否打算产生于一个基类的对象,这都要发生。