Java中的this關鍵字、static關鍵字和final關鍵字
this關鍵字
在普遍的教程或者某些教材中,對於this關鍵字的解釋就只有幾個字——“指向當前物件”。究竟為什麼說是指向當前物件並沒有解釋清楚。
我們需要知道同一個類的物件它們的屬性是屬於不同空間的,但是這些物件是共享類中的方法。所以它們需要一種方式表明是它們自己在呼叫該方法而不是其他的物件。
所以,當物件呼叫方法時,該物件會作為一個隱含實參傳入到非靜態方法中,在非靜態方法中使用this來指向它,表明是它在呼叫該方法。
以上轉換是編譯器自動完成,我們也不必擔心。
static關鍵字
引入static的目的
在《Java核心程式設計》中對static的描述有這樣的一句話:static方法就是沒有this的方法。在static的方法內部不能呼叫非靜態方法,反過來到是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法
static的作用
static關鍵字可以用於修飾以方面的內容
修飾變數
private static int a;
變數a可以稱為靜態變數也可以稱為類變數。這種變數是與物件無關的,所有物件將共享該變數。
可以使用 類名.靜態屬性名 進行訪問。
修飾方法
public static void printInfo(){
...}
這種方法被稱為靜態方法。
需要注意兩點:
靜態方法中是不存在this的。因為this是指向當前物件的,靜態方法是與類相關的,與物件無關,不存在物件呼叫問題。可以使用 類名.靜態方法名
靜態方法內部只能直接呼叫靜態方法和靜態成員。呼叫普通方法會報錯,在普通方法中可以呼叫靜態方法。
因為普通方法一般會將物件作為隱藏實參傳入並用this指向,在沒有建立物件時,普通方法中就不存在this,呼叫包含普通方法的靜態方法就會報錯!
修飾程式碼塊,可以在類的任意位置定義
可以看以下簡單示例程式碼,觀察靜態程式碼塊被執行的順序
public class A {
A(){
System.out.println("A constructor");
}
static {
System.out.println("A's static block" );
}
}
public class B extends A{
B(){
System.out.println("B constructor");
}
static {
System.out.println("B's static block");
}
}
public class StaticBlock {
public static void main(String[] args) {
B objb = new B();
}
}
/*output
A's static block
B's static block
A constructor
B constructor
*/
可以看出靜態程式碼塊的執行順序是在建構函式之前,在程式執行時,會先找到main入口,然後載入類,靜態程式碼塊就是在類載入的時候執行的。
public static void main(String[] args)
現在來看待被static修飾的主函式,這樣的好處可能就是:不用建立當前類的物件就可以呼叫,節省空間
使用static需要注意的地方
若是使用類名呼叫靜態方法還需要滿足該方法不是private
static不會改變類中成員的訪問許可權
在非靜態方法中是可以使用this訪問靜態變數
final關鍵字
final關鍵字可以修飾類、屬性和方法,final可以類比於C++中的const關鍵字
修飾屬性
在定義時就要賦初值,或者在建構函式中賦初值
一次賦值後便不可以被修改static final
當一個變數被static和final同時修飾後就會有點特殊
在類的準備階段時,不論你是否給靜態變數賦初值,它都只會給靜態變數賦預設值
但是如果變數是被static final修飾的話,在準備階段就會使用你賦予它的值進行初始化