1. 程式人生 > 實用技巧 >【Java程式設計基礎】——Java中Static關鍵字的使用

【Java程式設計基礎】——Java中Static關鍵字的使用

文章轉自http://www.cnblogs.com/dolphin0520/p/3799052.html

1.static關鍵字的用途

“static方法就是沒有this的方法。在static方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法。這實際上正是static方法的主要用途。”

2.static修飾類的成員變數

static變數也稱作靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是物件所擁有的,在建立物件的時候被初始化,存在多個副本,各個物件擁有的副本互不影響。static成員變數的初始化順序按照定義的順序進行初始化。

3.static修飾類的成員方法

static方法一般稱作靜態方法,由於靜態方法不依賴於任何物件就可以進行訪問,因此對於靜態方法來說,是沒有this的,因為它不依附於任何物件,既然都沒有物件,就談不上this了。並且由於這個特性,在靜態方法中不能訪問類的非靜態成員變數和非靜態成員方法,因為非靜態成員方法/變數都是必須依賴具體的物件才能夠被呼叫。但是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變數,但是在非靜態成員方法中是可以訪問靜態成員方法/變數的。

4.類中的靜態程式碼塊

static關鍵字還有一個比較關鍵的作用就是 用來形成靜態程式碼塊以優化程式效能。static塊可以置於類中的任何地方

,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次

5.簡單示例

Student類

package cn.york.statictest;

public class Student {

    private String sno;
    static String className;
    private String name;
    
    public String getSno() {
        return sno;
    }
    public void setSno(String sno) {
        
this.sno = sno; } public static String getClassName() { return className; } public static void setClassName(String className) { Student.className = className; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student() { } public Student(String sno,String className,String name) { this.sno = sno; this.className=className; this.name=name; } //靜態方法 public static void sayHi() { //靜態方法中不能訪問非靜態成員 //System.out.println("say hi! my sno is"+sno); //靜態方法中只能訪問該類中使用static修飾的成員 System.out.println("say hi! my class is "+className); } //靜態程式碼塊,只在類載入的時候執行一次 static{ System.out.println("我是Student類中的靜態程式碼塊!只在類載入的時候執行一次"); } }

test類

package cn.york.statictest;

public class test {


    public static void main(String[] args) {
    
        Student s1 = new Student();
        Student s2 = new Student("1002","軟體2班","張三");
        //static關鍵字修飾類的成員變數時,該類的所有物件共享該變數
        System.out.println(s2.getClassName());        
        System.out.println(s1.getClassName());
        //s1物件修改後,s2物件的該屬性隨之改變
        s1.setClassName("軟體4班");
        System.out.println(s2.getClassName());        
        
        /*static關鍵字修飾類的成員方法時,
         *既可以直接使用類名.方法名的方式來訪問;
         *也可以使用物件名.方法名的方式來訪問*/
        Student.sayHi();
        s1.sayHi();
        s2.sayHi();

    }

}

執行結果:

6.static關鍵使用注意事項

6.1static關鍵字不會改變類成員的訪問屬性

類的成員使用private修飾時,類的例項是無法訪問類中的私有成員的,這說明static關鍵字並不會改變變數和方法的訪問許可權。

6.2this關鍵字是否能訪問靜態成員變數

public void printclassName()
    {
        System.out.println(this.className);
    }
    public static void main(String[] args) {
        Student s1 = new Student("1002","軟體2班","張三");    
        s1.printclassName();
    }
    

執行結果

在非靜態方法中能夠通過this訪問靜態成員變數。

3.static能作用於區域性變數麼?

在C/C++中static是可以作用域區域性變數的,但是在Java中切記:static是不允許用來修飾區域性變數,這是Java語法的規定。

具體原因可以參考這篇博文的討論:http://www.debugease.com/j2se/178932.html

參考文章:

http://www.cnblogs.com/dolphin0520/p/3799052.html