final:
- 修飾類:類不能被繼承
- 修飾方法:方法不能被重寫
- 修飾變量:不能修改變量的指向,且只能賦值一次
- 全局變量是有默認值的,所以如果用final修飾全局變量,能在定義的同時賦值,或在構造函數中賦值(注意,其他方法不能給final全局變量賦值,會報錯)
- 局部變量不會默認賦值,因此如果用final修飾,可以初始化一次
- 注意:final變量是不能修改指向(即地址),但不代表不能改值,引用類型的話是可以改值的
代碼:
1.賦值問題
final變量可以在構造函數內賦值,這個特性可能會使人疑惑。
因爲全局變量是會默認賦值的,並且這個賦值操作是先於構造函數執行的,
所以可以在構造函數中賦值看起來似乎是不可能的。
但這確實是可以的,但也只能是構造函數,其他方法並不行。
這是因爲Java有一個“空白final”的東西,"空白final"指的是被申明final但未給初值的域。
此外,Java還規定空白final在使用之前必須初始化。
二者兼和,就出現了上面所說的特殊情況
eg.
class Test{
final int m =3;//,正常初始化,並賦值爲3,不存在“空白final”
final int n; //正常初始化,並初始化爲“空白final”
Test(){
n = 3; // “空白final”被賦值爲3
}
/*
* 注意,在非構造方法內給”空白final“賦值是非法的
* final int error ;
* void show(){
* error = 3; 這是會報錯的
* }
}
2.改值問題
calss Test1{
final int m =3; //基本數據類型,m裏面存放的是常量3的地址,所以m的值是無法改變的
final Test2 test2;
Test1(){
test = new Test2();
test.m = 4; //合法
test.n = 8; //合法
test = new Test2();//不合法,test不能指向新的地址
}
}
class Test2{
int m = 3;
int n= 6;
}
static 方法
“static方法就是沒有this的方法。在static方法內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建任何對象的前提下,僅僅通過類本身來調用static方法。這實際上正是static方法的主要用途。”
- static在對象存在前就存在(不是類存在前)
- static不能訪問非靜態方法和變量,反之可以
- static方法無法使用this,應爲不存在對象
static變量
-
static成員變量的初始化順序按照定義的順序進行初始化。
- 靜態變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類初次加載時會被初始化
static代碼塊
static關鍵字還有一個比較關鍵的作用就是 用來形成靜態代碼塊以優化程序性能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。
優化前,每次創建兩個對象
class Person{
private Date birthDate;
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
Date startDate = Date.valueOf("1946");
Date endDate = Date.valueOf("1964");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
優化後,只需創建一個
class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
}
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
注意:
class staticTest{
static int a=47;
static String[] s = new String[10];
}
staticTest t1 = new staticTest();
staticTest t2 = new staticTest();
t1.a和t2.a是同一個,不是兩個
t1.s和t2.s是也是同一個,不是兩個
static final
- java中的常量
- 變量名全部大寫()
- 必須在申明的同時賦值
- 由類名.訪問
- 在編譯時自動替換,效率高
- 不可改變
public static final double PI = 3.1415926;