1. 程式人生 > 實用技巧 >Java 關鍵字:static

Java 關鍵字:static

一、static

  1、引入

    當我們編寫一個類時,其實就是在描述其物件的屬性和行為,而並沒有產生實質上的物件,只有通過new關鍵字才會產生出物件,這時系統才會分配記憶體空間給物件,其方法才可以供外部呼叫。

    我們有時候希望無論是否產生了物件或無論產生了多少物件的情況下, 某些特定的資料在記憶體空間裡只有一份,例如所有的中國人都有個國家名稱,每一箇中國人都共享這個國家名稱,不必在每一箇中國人的例項物件中都單獨分配一個用於代表國家名稱的變數。

  2、類屬性、類方法的設計思想

    (1)類屬性作為該類各個物件之間共享的變數。 在設計類時,分析哪些屬性不因物件的不同而改變,將這些屬性設定為類屬性。相應的方法設定為類方法。

    (2)如果方法與呼叫者無關,則這樣的方法通常被宣告為類方法,由於不需要建立物件就可以呼叫類方法,從而簡化了方法的呼叫。

  3、概述

    static 的意思的靜態的,也是一種修飾符。

    用static關鍵字修飾的,屬於類,就可以不依靠建立物件來呼叫了。

    關於static關鍵字的使用,它可以用來修飾的成員變數和成員方法,被修飾的成員是屬於類的,而不是單單屬於某個物件的。

  3、使用範圍

    可以使用 static 修飾:(1)屬性、(2)方法、(3)程式碼塊、(4)內部類

  4、被修飾後的成員具備以下特點

    (1)隨著類的載入而載入;

    (2)優先於物件存在;

    (3)修飾的成員,被所有物件所共享;

    (4)訪問許可權允許時,可不建立物件,直接被類呼叫;

二、靜態變數(類變數)

  1、靜態變數 VS 非靜態變數

    按照成員變數是否被 static 修飾,可分為 靜態變數(類變數) 與 非靜態變數(例項變數)

    例項變數:當建立了類的多個物件,每個物件都獨立的擁有一套類中的非靜態屬性。當修改其中一個物件中的非靜態屬性時,不會導致其他物件中同樣的屬性值的修改。

    類變數:當建立了類的多個物件,多個物件共享同一個靜態變數。當通過某一個物件修改靜態變數時,會導致其他物件呼叫此靜態變數時,是修改過了的。

  2、類變數的特點

    (1)當static

修飾成員變數時,該變數稱為類變數。該類的每個物件都共享同一個類變數的值;

    (2)用static修飾的成員變數的值,儲存在方法區中;static 修飾的成員變數的get/set 也是靜態的;

    (3)任何物件都可以更改該類變數的值,但也可以在不建立該類的物件的情況下對類變數進行操作;

    (4)如果在方法中有區域性變數與 static 修飾的成員變數同名時,在靜態變數前面加 "類名." 進行區別(這裡不能使用this關鍵字);

    (5)static 不能修飾區域性變數;

    (6)靜態變數隨著類的載入而載入。可以通過"類.靜態變數"的方式進行呼叫;

    (7)靜態變數的載入要早於物件的建立;

    (8)由於類只會載入一次,則靜態變數在記憶體中也只會存在一份:存在方法區的靜態域中。

     定義格式

static 資料型別 變數名;

     Demo:

 1 public class Student {
 2     private String name;
 3     private String age;
 4     private int sid;
 5     private static int id = 1000;
 6         
 7     public Student(String name, String age) {
 8         super();
 9         this.sid = ++id;  //給學生分配學號
10         this.name = name;
11         this.age = age;
12     }
13     public String getName() {
14         return name;
15     }
16     public void setName(String name) {
17         this.name = name;
18     }
19     public String getAge() {
20         return age;
21     }
22     public void setAge(String age) {
23         this.age = age;
24     }
25     public static int getId() {
26         return id;
27     }
28     public static void setId(int id) {
29         Student.id = id;
30     }
31     
32 }

    

  3、類變數與例項變數記憶體解析

      (1)

    

      (2)static 修飾的內容

       ① static 修飾的內容是隨著類的載入而載入的,且只加載一次;

       ②儲存在一塊固定的記憶體區域(靜態區),所以,可以直接被類名呼叫;

       ③它優先於物件存在,所以,可以被所有物件共享。

      圖解:

三、靜態方法(類方法)

  1、類方法

    (1)當static修飾成員方法時,該方法稱為類方法或靜態方法;

    (2)靜態方法在宣告中有static,建議使用類名來呼叫,而不需要建立類的物件來呼叫,可以用類名.方法名()的形式訪問由static修飾的類方法。

    (3)類方法隨著類的載入而載入,可以通過"類.靜態方法"的方式進行呼叫;

    (4)靜態方法中,只能呼叫靜態的方法或屬性;

      static方法內部只能訪問類的static修飾的屬性或方法, 不能訪問類的非static的結構。

      非靜態方法中,既可以呼叫非靜態的方法或屬性,也可以呼叫靜態的方法或屬性;

  2、Demo

    定義格式:

修飾符 static 返回值型別 方法名 (引數列表){
    // 執行語句
}

    Demo:在上面的 Student 類中定義一個靜態方法

1 public static void showNum() {
2     System.out.println("num:" + numberOfStudent);
3 }

  3、注意點

    (1)靜態方法可以直接訪問靜態變數和靜態方法。(原因:因為在記憶體當中是【先】有的靜態內容,【後】有的非靜態內容。)

    (2)靜態方法不能直接訪問普通成員變數或成員方法。反之,成員方法可以直接訪問靜態變數或靜態方法。

    (3)靜態方法中,不能使用this,super關鍵字。(原因:this代表當前物件,通過誰呼叫的方法,誰就是當前物件。)

    (4)static修飾的方法不能被重寫(static修飾的方法是隨著類載入而載入,而重寫是在編譯時)

    (5)靜態方法只能訪問靜態成員,非靜態方法即可以訪問非靜態成員也可以訪問靜態成員。

  4、呼叫格式

    被static修飾的成員可以並且建議通過類名直接訪問。雖然也可以通過物件名訪問靜態成員,原因即多個物件均屬於一個類,共享使用同一個靜態成員,但是不建議,會出現警告資訊。

    呼叫格式:

// 訪問類變數
類名.類變數名;

// 呼叫靜態方法
類名.靜態方法名(引數);

四、static 修飾程式碼塊

  static 修飾程式碼塊

  小結:static 關鍵字,可以修飾變數、方法和程式碼塊。在使用的過程中,其主要目的還是想在不建立物件的情況下,去呼叫方法。