final變量
(1)一個永不改變的編譯時常量
(2)一個運行時被初始化的值,而你不但願被改變
賦值的方式:
(1)聲明變量時直接賦值
(2)非靜態成員變量在{}塊中賦值,靜態成員變量在static{}塊中賦值
(3)非靜態成員變量在構造方法中賦值
final類
final類不能被繼承,因此沒有子類
final方法
final修飾的方法不能被覆蓋
private方法都是隱式指定爲final的,能夠對private方法添加final修飾詞,但這並不能給改方法增長任何額外的意義
final和static
(1)static對象和代碼段初始化是類加載的時候,類的代碼初始化是實例化的時候(建立第一個對象的時候)
(2)static修飾的變量在內存中只有一個副本,final修飾的變量表示變量不可變
(3)一個既是static又是final的域只佔據一段不能改變的內存空間
public class Insect {
private int i = 9;
protected int j;
Insect(){
System.out.println("i = " + i + " j= " + j );
j = 10;
}
private static int x1 = printInit("static insect.x1 initialized");
static int printInit(String s){
System.out.println(s);
return 47;
}
}
class Beetle extends Insect{
private int k = printInit("Beetle.k initialized");
public Beetle(){
System.out.println("k=" + k);
System.out.println("j=" + j);
}
private static int x2 = printInit("static insect.x2 initialized");
public static void main(String[] args) {
System.out.println("Better constructor");
Beetle b = new Beetle();
}
}
//結果
static insect.x1 initialized
static insect.x2 initialized
Better constructor
i = 9 j= 0
Beetle.k initialized
k=47
j=10
//final和static
public class StaticFinalTest {
public static void main(String[] args) {
RandomNum num1 = new RandomNum();
RandomNum num2 = new RandomNum();
System.out.println("final " + num1.i);
System.out.println("static " + num1.j);
System.out.println("final " + num2.i);
System.out.println("static " + num2.j);
}
}
class RandomNum {
public final double i = Math.random();
public static double j = Math.random();
}
//結果
final 0.5031454567046049
static 0.9587339756327171
final 0.6941988751561768
static 0.9587339756327171
匿名內部類中使用的外部局部變量只能是final變量
緣由:方法中局部變量的生命週期和匿名內部類中聲明週期不同,有可能方法中變量生命週期結束,而匿名內部類中的變量沒有結束。
final字段如何做用:拷貝方法中的局部變量到匿名內部類,這樣的話,匿名內部類中訪問的變量是和外部方法中值相等的另外一個變量。