java Static的使用


static是一個靜態修飾符,用於修飾成員(成員變量,成員函數)。《thinking in java》對staic的使用場景有下面2種定義:“一種情形是只想用一個存儲區域來保存一個特定的數據—— 無論要創建多少個對象,甚至根本不創建對象。另一種情形是我們需要一個特殊的方法,它沒有與這個類的任何對象關聯。也就是說,即使沒有創建對象,也需要一個能調用的方法”。。在類中,用static聲明的成員變量成為靜態成員變量,用static聲明的方法即稱為靜態方法。對於static,它有如下幾個特點:

 1.隨着類的加載而加載。

一旦static被創建,它會一直存在靜態常量池中,知道程序執行完,隨着類的消失而消失,它的生命周期相對來說是最長的。

2.優先於對象存在

靜態是優先於對象存在的。

舉個例子:

public class Demo {

    public static void main(String[] args) {
        Test.name="hello";
        Test.staticHello();//優於對象創建,所以可以直接調用static修飾的方法
        //Test.age=0 //調用非靜態變量age會報錯,因為對象還未創建
        Test t=new Test();//創建對象
        t.age=18;//這個時候就可以調用非靜態變量和方法
        t.normalHello();
        
    }
}
class Test{
    static String name;
    int age;
    public static void staticHello(){
        System.out.println("static name:"+name);
    }
    public void normalHello(){
        System.out.println("normal age:"+age);
    }
}

輸出結果為:

static name:hello
normal age:18

 

從這個例子還可以看出,我們可以在沒有創建對象的情況下,通過類名直接調用static修飾的方法和變量,所以可以得知,static是不依賴於對象存在的,即

3.被類的所有對象所共享

因此,靜態的成員變量和方法也不能使用this,super關鍵字,這2個關鍵字都是基於對象的。

4.可以直接被類名所調用

在上述的例子中,可以看到static修飾的變量方法是直接通過類名Test調用出來的,當然,在創建對象之后,同樣可以使用創建的對象去調用這個方法。

在不創建對象的情況下,靜態方法不能訪問類的非靜態成員變量/方法,main方法就是一個靜態方法,假如我們在Demo類里創建一個成員變量String names,要在main方法里直接取到這個值是不行的,如果沒有創建對象,它就不能直接訪問。而非靜態方法可以訪問靜態成員/方法

《Thinking in java4》中“當程序創建第一個對類的靜態成員的引用時,就會加載這個類。這個證明構造器也是類的靜態方法,即使在構造器之前沒有使用static關鍵字”。因為靜態方法可以在未創建對象時調用,從這個角度看,構造方法在對象未創建時調用,可以看作是靜態方法。
但從另一個方面來看,靜態方法不能調用實例方法,而構造方法可以調用實例方法,所以構造方法也不算是靜態方法。

 

轉載請注明出處http://www.cnblogs.com/epilogue/p/5670220.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM