Java 的 static 關鍵字

瑪拉_以琳發表於2023-02-24

static關鍵字

1 概述

定義如下類:

public class Student {
    // 成員變數
    public String name;
    public char sex; // '男'  '女'
    public int age;

    // 無引數構造方法
    public Student() {

    }
    
    // 有引數構造方法
    public Student(String  a) {

    }
}

已經知道物件導向中,存在類和物件的概念,在類中定義了一些成員變數,例如name,age,sex ,結果發現這些成員變數,每個物件都存在(因為每個物件都可以訪問)。

而像name ,age , sex確實是每個學生物件都應該有的屬性,應該屬於每個物件。

所以Java中成員(變數和方法)等是存在所屬性的,Java是透過static關鍵字來區分的。static關鍵字在Java開發非常的重要,對於理解物件導向非常關鍵。

關於 static 關鍵字的使用,它可以用來修飾的成員變數和成員方法,被static修飾的成員是屬於類的是放在靜態區中,沒有static修飾的成員變數和方法則是屬於物件的。我們上面案例中的成員變數都是沒有static修飾的,所以屬於每個物件。

2 定義格式和使用

static是靜態的意思。 static可以修飾成員變數或者修飾方法。

2.1 靜態變數及其訪問

有static修飾成員變數,說明這個成員變數是屬於類的,這個成員變數稱為類變數或者靜態成員變數。 直接用 類名訪問即可。因為類只有一個,所以靜態成員變數在記憶體區域中也只存在一份。所有的物件都可以共享這個變數。

如何使用呢

例如現在我們需要定義傳智全部的學生類,那麼這些學生類的物件的學校屬性應該都是“傳智”,這個時候我們可以把這個屬性定義成static修飾的靜態成員變數。

定義格式

修飾符 static 資料型別 變數名 = 初始值;    

舉例

public class Student {
    public static String schoolName = "傳智播客"; // 屬於類,只有一份。
    // .....
}

靜態成員變數的訪問:

格式:類名.靜態變數

public static void  main(String[] args){
    System.out.println(Student.schoolName); // 傳智播客
    Student.schoolName = "黑馬程式設計師";
    System.out.println(Student.schoolName); // 黑馬程式設計師
}

2.2 例項變數及其訪問

無static修飾的成員變數屬於每個物件的, 這個成員變數叫例項變數,之前我們寫成員變數就是例項成員變數。

需要注意的是:例項成員變數屬於每個物件,必須建立類的物件才可以訪問。

格式:物件.例項成員變數

2.3 靜態方法及其訪問

有static修飾成員方法,說明這個成員方法是屬於類的,這個成員方法稱為類方法或者靜態方法**。 直接用 類名訪問即可。因為類只有一個,所以靜態方法在記憶體區域中也只存在一份。所有的物件都可以共享這個方法。

與靜態成員變數一樣,靜態方法也是直接透過類名.方法名稱即可訪問。

舉例

public class Student{
    public static String schoolName = "傳智播客"; // 屬於類,只有一份。
    // .....
    public static void study(){
        System.out.println("我們都在黑馬程式設計師學習");   
    }
}

靜態成員變數的訪問:

格式:類名.靜態方法

public static void  main(String[] args){
    Student.study();
}

2.4 例項方法及其訪問

無static修飾的成員方法屬於每個物件的,這個成員方法也叫做例項方法

需要注意的是:例項方法是屬於每個物件,必須建立類的物件才可以訪問。

格式:物件.例項方法

示例

public class Student {
    // 例項變數
    private String name ;
    // 2.方法:行為
    // 無 static修飾,例項方法。屬於每個物件,必須建立物件呼叫
    public void run(){
        System.out.println("學生可以跑步");
    }
    // 無 static修飾,例項方法
    public  void sleep(){
        System.out.println("學生睡覺");
    }
    public static void study(){
        
    }
}
public static void main(String[] args){
    // 建立物件 
    Student stu = new Student ;
    stu.name = "徐幹";
    // Student.sleep();// 報錯,必須用物件訪問。
    stu.sleep();
    stu.run();
}

3 小結

1.當 static 修飾成員變數或者成員方法時,該變數稱為靜態變數,該方法稱為靜態方法。該類的每個物件都共享同一個類的靜態變數和靜態方法。任何物件都可以更改該靜態變數的值或者訪問靜態方法。但是不推薦這種方式去訪問。因為靜態變數或者靜態方法直接透過類名訪問即可,完全沒有必要用物件去訪問。

2.無static修飾的成員變數或者成員方法,稱為例項變數,例項方法,例項變數和例項方法必須建立類的物件,然後透過物件來訪問。

3.static修飾的成員屬於類,會儲存在靜態區,是隨著類的載入而載入的,且只載入一次,所以只有一份,節省記憶體。儲存於一塊固定的記憶體區域(靜態區),所以,可以直接被類名呼叫。它優先於物件存在,所以,可以被所有物件共享。

4.無static修飾的成員,是屬於物件,物件有多少個,他們就會出現多少份。所以必須由物件呼叫。

相關文章