天天看點

java中的static詳解

今天學習Java中的類的時候,在構造方法時一不小心用上了static。原意:求解兩點的距離,結果解釋器報錯。

public static double getdis(classify p){
        return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
    }      

是以我查了一下static的含義

在類中,使用 static 修飾符修飾的屬性(成員變量)稱為靜态變量,也可以稱為類變量,常量稱為靜态常量,方法稱為靜态方法或類方法,它們統稱為靜态成員,歸整個類所有。

靜态成員不依賴于類的特定執行個體,被類的所有執行個體共享,就是說 static 修飾的方法或者變量不需要依賴于對象來進行通路,隻要這個類被加載,​​Java​​ 虛拟機就可以根據類名找到它們。

調用靜态成員的文法形式如下:

類名.靜态成員      

注意:

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

靜态變量

類的成員變量可以分為以下兩種:

  1. 靜态變量(或稱為類變量),指被 static 修飾的成員變量。
  2. 執行個體變量,指沒有被 static 修飾的成員變量。

靜态變量與執行個體變量的差別如下:

1)靜态變量

  • 運作時,Java 虛拟機隻為靜态變量配置設定一次記憶體,在加載類的過程中完成靜态變量的記憶體配置設定。
  • 在類的内部,可以在任何方法内直接通路靜态變量。
  • 在其他類中,可以通過類名通路該類中的靜态變量。

2)執行個體變量

  • 每建立一個執行個體,Java 虛拟機就會為執行個體變量配置設定一次記憶體。
  • 在類的内部,可以在非靜态方法中直接通路執行個體變量。
  • 在本類的靜态方法或其他類中則需要通過類的執行個體對象進行通路。

靜态變量在類中的作用如下:

  • 靜态變量可以被類的所有執行個體共享,是以靜态變量可以作為執行個體之間的共享資料,增加執行個體之間的互動性。
  • 如果類的所有執行個體都包含一個相同的常量屬性,則可以把這個屬性定義為靜态常量類型,進而節省記憶體空間。例如,在類中定義一個靜态常量 PI。

靜态方法

與成員變量類似,成員方法也可以分為以下兩種:

  1. 靜态方法(或稱為類方法),指被 static 修飾的成員方法。
  2. 執行個體方法,指沒有被 static 修飾的成員方法。

靜态方法與執行個體方法的差別如下:

  • 靜态方法不需要通過它所屬的類的任何執行個體就可以被調用,是以在靜态方法中不能使用 this 關鍵字,也不能直接通路所屬類的執行個體變量和執行個體方法,但是可以直接通路所屬類的靜态變量和靜态方法。另外,和 this 關鍵字一樣,super 關鍵字也與類的特定執行個體相關,是以在靜态方法中也不能使用 super 關鍵字。
  • 在執行個體方法中可以直接通路所屬類的靜态變量、靜态方法、執行個體變量和執行個體方法。

靜态代碼塊

靜态代碼塊指 Java 類中的 static{ } 代碼塊,主要用于初始化類,為類的靜态變量賦初始值,提升程式性能。

靜态代碼塊的特點如下:

  • 靜态代碼塊類似于一個方法,但它不可以存在于任何方法體中。
  • 靜态代碼塊可以置于類中的任何地方,類中可以有多個靜态初始化塊。
  • Java 虛拟機在加載類時執行靜态代碼塊,是以很多時候會将一些隻需要進行一次的初始化操作都放在 static 代碼塊中進行。
  • 如果類中包含多個靜态代碼塊,則 Java 虛拟機将按它們在類中出現的順序依次執行它們,每個靜态代碼塊隻會被執行一次。
  • 靜态代碼塊與靜态方法一樣,不能直接通路類的執行個體變量和執行個體方法,而需要通過類的執行個體對象來通路。
public static double getdis(classify p1,classify p2){
        return Math.sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
    }      

繼續閱讀