1. 程式人生 > >static詳解

static詳解

protect cep 並且 sans 改變 return 使用 靜態 關聯

static是java中的修飾符,他可以修飾成員方法,成員變量,成員內部類,代碼塊。

1、static修飾成員方法

static修飾的方法稱為靜態方法,該方法直接隸屬於類,而不是一個實例對象,因此,調用靜態方法不需要

實例化該類的對象,只需類被加載之後,使用類名.方法名調用即可。同時應該註意,靜態方法中不能調用非靜態方法

和非靜態變量。

2、static修飾變量

static變量稱為靜態變量,靜態變量與非靜態變量的區別是,靜態變量在內存中只有一個副本,它只在類被加

載的時候初始化一次。非靜態變量隸屬於一個實例,當實例被初始化時,他便被初始化一次,並產生一個副本,因此,有

多少個實例對象,便有多少個副本,各個對象擁有的副本之間互不影響。

3、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;
    }
}

isBornBoomer是用來這個人是否是1946-1964年出生的,而每次isBornBoomer被調用的時候,都會生成startDate和

birthDate兩個對象,造成了空間浪費,如果改成這樣效率會更好:

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;
    }
}

因此,很多時候會將一些只需要進行一次的初始化操作都放在static代碼塊中進行。

4、static關鍵字的一些誤區


1.static關鍵字會改變類中成員的訪問權限嗎?

  有些初學的朋友會將java中的static與C/C++中的static關鍵字的功能混淆了。在這裏只需要記住一點:與C/C++中

的static不同,Java中的static關鍵字不會影響到變量或者方法的作用域。在Java中能夠影響到訪問權限的只有private、

public、protected(包括包訪問權限)這幾個關鍵字。

2.能通過this訪問靜態成員變量嗎?

  雖然對於靜態方法來說沒有this,那麽在非靜態方法中能夠通過this訪問靜態成員變量嗎?先看下面的一個例子,

這段代碼輸出的結果是什麽?結果是:33

public class Main {  
static int value = 33;

public static void main(String[] args) throws Exception{
new Main().printValue();
}

private void printValue(){
int value = 3;
System.out.println(this.value);
}
}

3.static能作用於局部變量麽?  

這裏面主要考察隊this和static的理解。this代表什麽?this代表當前對象,那麽通過new Main()來調用printValue的話,

當前對象就是通過new Main()生成的對象。而static變量是被對象所享有的,因此在printValue中的this.value的值毫無

疑問是33。在printValue方法內部的value是局部變量,根本不可能與this關聯,所以輸出結果是33。在這裏永遠要記

住一點:靜態成員變量雖然獨立於對象,但是不代表不可以通過對象去訪問,所有的靜態方法和靜態變量都可以通

過對象訪問(只要訪問權限足夠)。

  在C/C++中static是可以作用域局部變量的,但是在Java中切記:static是不允許用來修飾局部變量。不要問為什麽,

這是Java語法的規定。



static詳解