1. 程式人生 > >Java中的static關鍵字個人看法總結

Java中的static關鍵字個人看法總結

static概括:方便在沒有建立物件的情況下來進行呼叫方法/變數,而非static的變數和方法,只有例項存在才存在。
  1. 沒有this的方法,因為靜態方法不依賴於任何物件就可以進行訪問。
  2. 在static方法內部不能呼叫非靜態方法,反之可以,因為沒有this,所以在靜態方法中不能訪問類的非靜態成員變數和非靜態成員方法。
  3. 可以在沒有建立任何物件的前提下,通過類本身來呼叫static方法,因為被static關鍵字修飾的方法或者變數 不需要依賴於物件進行訪問,只要類被載入了就可以通過類名進行訪問。

static可以用來修飾類的成員方法、類的成員變數,另外可以編寫static程式碼塊來優化程式效能。

  • static方法
    最常見的static方法就是main方法,至於為什麼main方法必須是static的,現在就很清楚了。因為程式在執行main方法的時候沒有建立任何物件,因此只有通過類名來訪問。      另外記住,即使沒有顯示地宣告為static,類的構造器實際上也是靜態方法
  • static變數
     
靜態變數和非靜態變數的區別是:
  •      靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。
  •      而非靜態變數是物件所擁有的,在建立物件的時候被初始化,存在多個副本,各個物件擁有的副本互不影響。
     static成員變數的初始化順序按照定義的順序進行初始化。
  • static程式碼塊
     static塊可以置於類中的任何地方,類中可以有多個static塊。   至於為什麼說static塊可以用來優化程式效能,是因為它的特性:只會在類載入的時候執行一次,通俗一點說就是,避免了空間浪費,還能提升執行效率,何樂而不為呢。

但需要注意static不會改變方法/變數的訪問許可權,java中方法/變數訪問許可權 只和private、public、protected這幾個關鍵字有關。 同時,在Java中static是不允許用來修飾區域性變數。至於為什麼,我很想回答這是Java死規定,沒有為什麼,但是還是闡述一下個人理解, 在類中,被標記為static的方法和變數,jvm就會認為你要延長其生命週期,既然延長就直接申明為全域性變數,所以沒有必要使用static修飾區域性變數,即  類在  static在。

  • 靜態內部類
  public class OuterClass {
    static class StaticInnerClass {//內部靜態類 ,不能與外部類重名
        //只可以訪問OuterClass的靜態成員 ,不能直接訪問外部類的例項欄位和例項方法
    }                                       
}
  • 內部類
public class Outer {
    public class Inner{//成員類不能與外部類重名,成員類不能是介面(interface)
     //成員類可訪問外部類的任一個例項欄位和例項函式。
     //不能在成員類中定義static欄位、方法和類(static final形式的常量定義除外),因為一個成員類例項必然與一個外部類例項關聯,這個static定義完全可以移到其外部類中去
     //成員類可以定義為介面(interface) ,但不能是介面,沒有實際意義,成員類定義是為了能被某個外部類例項例項化,而介面是不能例項化的。
    }
}

  • 靜態導包
        靜態導包就是java包的靜態匯入,用import static代替import靜態匯入包是JDK1.5中的新特性。         使用靜態匯入可以使被匯入類的靜態變數靜態方法在當前類直接可見,使用這些靜態成員無需再給出他們的類名。       語法是: import static 包名.類名.靜態成員變數; import static 包名.類名.靜態成員函式;