Java基礎:關鍵字 static

static關鍵字

在類中,用static聲明的成員變量爲靜態成員變量,也成爲類變量。類變量的生命週期和類相同,在整個應用程序執行期間都有效。

這裏要強調一下:

  • static修飾的成員變量和方法,從屬於類
  • 普通變量和方法從屬於對象
  • 靜態方法不能調用非靜態成員,編譯會報錯

static關鍵字的用途

一句話描述就是:方便在沒有創建對象的情況下進行調用(方法/變量)。

顯然,被static關鍵字修飾的方法或者變量不需要依賴於對象來進行訪問,只要類被加載了,就可以通過類名去進行訪問。

static可以用來修飾類的成員方法、類的成員變量,另外也可以編寫static代碼塊來優化程序性能

static變量

Java類提供了兩種類型的變量:用static關鍵字修飾的靜態變量和不用static關鍵字修飾的實例變量。靜態變量屬於類,在內存中只有一個複製,只要靜態變量所在的類被加載,這個靜態變量就會被分配空間,因此就可以被使用了。對靜態變量的引用有兩種方式,分別是“類.靜態變量"和”對象.靜態變量"

實例變量屬於對象,只有對象被創建後,實例變量纔會被分配內存空間,才能被使用,它在內存中存在多個複製,只有用“對象.實例變量”的方式來引用。不能在成員函數內部定義static變量

static變量也稱爲靜態變量,靜態變量和非靜態變量的區別:

  • 靜態變量被所有對象共享,在內存中只有一個副本,在類初次加載的時候纔會初始化

  • 非靜態變量是對象所擁有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響

static方法

static方法也成爲靜態方法,由於靜態方法不依賴於任何對象就可以直接訪問,因此對於靜態方法來說,是沒有this的,因爲不依附於任何對象,既然都沒有對象,就談不上this了,並且由於此特性,在靜態方法中不能訪問類的非靜態成員變量和非靜態方法,因爲非靜態成員變量和非靜態方法都必須依賴於具體的對象才能被調用。

Java中提供了static方法和非static方法。static方法是類的方法,不需要創建對象就可以被調用,而非static方法是對象的方法,只有對象被創建出來後纔可以被使用

static方法中不能使用this和super關鍵字,不能調用非static方法,只能訪問所屬類的靜態成員變量和成員方法,因爲當static方法被調用時,這個類的對象可能還沒被創建,即使已經被創建了,也無法確定調用哪個對象的方法。同理,static方法也不能訪問非static類型的變量。

單例設計模式:

static一個很重要的用途就是實現單例設計模式。單利模式的特點是該類只能有一個實例,爲了實現這一功能,必須隱藏類的構造函數,即把構造函數聲明爲private,並提供一個創建對象的方法,由於構造對象被聲明爲private,外界無法直接創建這個類型的對象,只能通過該類提供的方法來獲取類的對象,要達到這樣的目的只能把創建對象的方法聲明爲static

static塊

構造方法用於對象的初始化。靜態初始化塊,用於類的初始化操作。

在靜態初始化塊中不能直接訪問非staic成員。這些static代碼塊只會被執行一次

static塊的作用

靜態初始化塊的作用就是:提升程序性能。

Java中的static關鍵字不會影響到變量或者方法的作用域。在Java中能夠影響到訪問權限的只有private、public、protected(包括包訪問權限)這幾個關鍵字。

靜態成員變量雖然獨立於對象,但是不代表不可以通過對象去訪問,所有的靜態方法和靜態變量都可以通過對象訪問(只要訪問權限足夠)。

static是不允許用來修飾局部變量。

static與final結合使用表示的意思

對於變量,若使用static  final修飾,表示一旦賦值不能修改,並且通過類名可以訪問。

對於方法,若使用static final修飾,表示該方法不可被覆蓋,並且可以通過類名直接訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章