一、static關鍵字
static關鍵字在類中可以宣告屬性或方法。宣告的屬性將稱為全域性屬性,宣告的方法將成為類方法。
static的使用注意
1、靜態方法和靜態變數是屬於某一個類,而不屬於類的物件。
2、靜態方法和靜態變數的引用直接通過類名引用。
3、使用static宣告的方法,不能訪問非static的操作(屬性或方法)
4、非static宣告的方法,可以訪問static宣告的屬性或方法
原因:
1、 如果說現在一個類中的屬性或方法都是非static型別的,肯定是要有例項化物件才可以呼叫。
2、 static宣告的屬性或方法可以通過類名稱訪問,可以在沒有例項化物件的情況下呼叫。
當一個例項化物件產生之後,可以呼叫所有的非static的操作,那麼肯定也就可以呼叫所有的static操作。
1.1、靜態資料
在我們建立一個類的例項時(物件),通常使用new方法,這樣這個類的資料空間才會被建立,其方法才能被呼叫。但是,有時候我們希望一個類雖然可以被建立n個物件(顯然這n個物件的資料空間是不相同的),但這n個物件的某些資料是相同的,即不管這個類有多少的例項,這些資料對這些例項而言之有一份記憶體拷貝,這是靜態變數的情形。
public class TStatic {
static int i;
public TStatic() {
i = 4;
}
public TStatic(int j) {
i = j;
}
public static void main(String args[]) {
System.out.println(TStatic.i);
TStatic t = new TStatic(5); // 宣告物件引用,並例項化。此時i=5
System.out.println(t.i);
TStatic tt = new TStatic(); // 宣告物件引用,並例項化。此時i=4
System.out.println(t.i);
System.out.println(tt.i);
System.out.println(t.i);
}
}
/*Output
0,5,4,4,4
*/
1.2、靜態方法
望某個方法不與包含它的類的任何物件關聯在一起。也就是說,即使沒有建立物件,也能夠呼叫這個方法。static方法的一個重要用法就是在不建立任何物件的前提下,這是靜態方法的情形
class Singleton {
private static final Singleton instance = new Singleton() ; // 在內部準備好一個物件
public static Singleton getInstance(){ // 將instance傳遞到外部去
return instance ;
}
private Singleton(){}
public void print(){
System.out.println("Hello World!!!") ;
}
};
public class Test{
public static void main(String args[]){
Singleton s1 = Singleton.getInstance() ;
Singleton s2 = Singleton.getInstance() ;
Singleton s3 = Singleton.getInstance() ;
s1.print() ;
s2.print() ;
s3.print() ;
}
};
單例設計模式中,當一個類中只能產生一個例項化物件的時候,就需要將構造方法封閉,封閉之後的操作通過一個靜態方法取得本類的例項化物件,
1.3、靜態初始化
靜態塊:使用static關鍵字宣告的程式碼塊,靜態程式碼塊在第一次載入類時執行,而且只執行一次,當訪問類的靜態屬性或者方法,建立類物件,或者執行該類的main方法之前,都要載入類。可以用來為靜態變數初始化。在主類中定義的靜態塊將優先於主方法main()執行。而且可以發現靜態塊優先於構造塊執行.
class Cup {
Cup(int marker) {
System.out.println("Cup(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Cups {
static Cup cup1;
static Cup cup2;
static {
cup1 = new Cup(1);
cup2 = new Cup(2);
}
Cups() {
System.out.println("Cups()");
}
}
public class ExplicitStatic {
static {
System.out.println("靜態塊在類載入時候執行");
}
public static void main(String[] args) {
System.out.println("Inside main()");
Cups.cup1.f(99);
}
} /*
* Output:
靜態塊在類載入時候執行
Inside main()
Cup(1)
Cup(2)
f(99)
*/
可以使用靜態塊“替代”掉main方法。
static {
System.out.println("HelloWorld!!!") ;
System.exit(1);
}
二、final關鍵字
在Java中可以使用final關鍵字定義類、方法、屬性:
2.1、Final資料
1、使用final宣告的變數即成為常量,常量必須在宣告處或者構造器內初始化。
2、在宣告一個常量的時候所有的單詞的字母都必須採用大寫的形式出現,
3、在引數列表中以宣告的方式將引數宣告為final,意味著你無法在方法中更改引數引用指定的物件。
4、一個永不改變的編譯時常量或者在執行時被初始化的值,並且不能改變
private static Random rand = new Random(47);
private final int i = rand.nextInt(20);
2.2、Final方法
使用final宣告的方法不能被子類所覆寫
2.3、Final類
使用final關鍵字定義的類不能有子類