Java基礎知識整理之static修飾屬性

Wayfreem發表於2019-01-19

static 關鍵字,我們在開發用的還是比較多的。在《Java程式設計思想》有下面一段話

static 方法就是沒有 this 的方法。在 static 方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫 static 方法。這實際上正是 static 方法的主要用途。

static 的用法比較廣泛:靜態變數、靜態成員、靜態函式等。我們在使用單列模式的時候,就會用到它。並且 static 資料成員儲存在靜態儲存區,只儲存一次,可以節省記憶體。

static 宣告屬性

static 修飾成員變數

當我們需要在一個類(class)中定義一個屬性為公共的屬性,就好比說我們需要這個屬性是所有類都是共有的,並且這個屬性的值是同一個。

Test.java

class Book{
    
    // 設定一個預設的值
    static String pub = "清華大學出版社";
    
    // 用來和 static 作為對比
    String description = "描述";
    
    // Book 類正常的屬性
    private String title;
    private double price;
    
    // Book 的構造類
    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }
    
    // 獲取 Book 的資訊
    public void getInfo(){
        System.out.println("圖書名稱:"+ this.title + ",價格為:"+ this.price + ",出版社為:"+ this.pub + ",描述 "+ this.description);
    }
}

public class Test {

    public static void main(String[] args) {
        // 例項化三個Book類
        Book book1 = new Book("Android開發實戰", 69.8);
        Book book2 = new Book("Java EE開發實戰", 49.8);
        Book book3 = new Book("Java 開發教程", 79.8);
        
        // 在沒有設定 pub 屬性的情況下輸出
        book1.getInfo();
        book2.getInfo();
        book3.getInfo();
        
        System.out.println("————————————————————無敵分割線————————————————————");
        
        // 我們給 book1 設定一個 pub 屬性
        book1.pub = "中信出版社";
        book1.description = "這本書很牛逼,看了你就知道";
        
        book1.getInfo();
        book2.getInfo();
        book3.getInfo();
    }
}

控制檯輸出

圖書名稱:Android開發實戰,價格為:69.8,出版社為:清華大學出版社,描述 描述
圖書名稱:Java EE開發實戰,價格為:49.8,出版社為:清華大學出版社,描述 描述
圖書名稱:Java 開發教程,價格為:79.8,出版社為:清華大學出版社,描述 描述
————————————————————無敵分割線————————————————————
圖書名稱:Android開發實戰,價格為:69.8,出版社為:中信出版社,描述 這本書很牛逼,看了你就知道
圖書名稱:Java EE開發實戰,價格為:49.8,出版社為:中信出版社,描述 描述
圖書名稱:Java 開發教程,價格為:79.8,出版社為:中信出版社,描述 描述

從控制檯輸出的結果,可以看到:

  • 如果給 屬性 賦預設值,在上面的例子中是(description 和 pub),輸出的結果為都是預設的。
  • 當我們修改了類中 static 關鍵字宣告的屬性,那麼只要修改了一次,那麼其他所有的物件的這個屬性都配修改了。

通過類呼叫 static 宣告的屬性

但是基於上面的程式碼,我們發現如果是其中的一個類物件就改變了所有的物件的屬性,這樣子操作是不是感覺不是特別好?然後在Java中,如果是使用 static 宣告的屬性值,是可以直接通過類呼叫的。

public class Test {

    public static void main(String[] args) {
        // 例項化三個Book類
        Book book1 = new Book("Android開發實戰", 69.8);
        Book book2 = new Book("Java EE開發實戰", 49.8);
        Book book3 = new Book("Java 開發教程", 79.8);
        
        // 在沒有設定 pub 屬性的情況下輸出
        book1.getInfo();
        book2.getInfo();
        book3.getInfo();
        
        System.out.println("————————————————————無敵分割線————————————————————");
        
        // 我們使用 Book 類直接呼叫pub
        Book.pub = "中信出版社";
        
        book1.description = "這本書很牛逼,看了你就知道";
        
        book1.getInfo();
        book2.getInfo();
        book3.getInfo();
    }
}

沒有例項化類時,呼叫 static 屬性

Test.java

class Book{
    
    // 設定一個預設的值
    static String pub = "清華大學出版社";
    
    // 用來和 static 作為對比
    String description = "描述";
    
    // Book 類正常的屬性
    private String title;
    private double price;
    
    // Book 的構造類
    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }
    
    // 獲取 Book 的資訊
    public void getInfo(){
        System.out.println("圖書名稱:"+ this.title + ",價格為:"+ this.price + ",出版社為:"+ this.pub + ",描述 "+ this.description);
    }
}

public class Test {

    public static void main(String[] args) {
        // 在沒有例項化物件時,就呼叫
        System.out.println(Book.pub);
        
        // 沒事例項化物件的時候,去給static屬性賦值上預設值
        Book.pub = "北京大學出版社";
        System.out.println(Book.pub);
        
        // 新建一個類,輸入 pub 屬性
        Book book = new Book("Java", 88);
        book.getInfo();
    }
}

控制檯輸出

清華大學出版社
北京大學出版社
圖書名稱:Java,價格為:88.0,出版社為:北京大學出版社,描述 描述

由此,我們看出,在沒有例項化物件的時候,就可以直接通過類去掉用 static屬性,並且還可以修改 static 的屬性。static 屬性宣告雖然是在類的結構中,但是並不受到物件的控制,是獨立存在的。

static 屬性與非 static 屬性的區別

  • static 宣告的屬性和普通屬性(非 static 屬性)最大的區別在於儲存的記憶體區域不同。static 所修飾的在靜態資料區。而不是在堆和棧。
  • static 屬性與非 static 屬性還有一個最大的區別,就是在於所有非 static 屬性必須產生例項化之後才可以訪問,但是static 屬性不受例項化物件的控制。也就是說,在沒有產生例項化物件的情況下,依然可以使用 static 物件。

相關文章