天天看點

了解超然物外的static-屬性篇 | 帶你學《Java面向對象程式設計》之十

上一篇:一則案例帶你通曉簡單Java類 | 帶你學《Java面向對象程式設計》之九

【本節目标】

通過學習本節,你将了解到static定義靜态屬性的作用,能夠分辨使用static的場景,學會通過類名直接調用static屬性。

Static是一個關鍵字,這個關鍵字主要可以用來定義屬性和方法,下面将針對于此關鍵字的使用進行分析。

static定義屬性

在一個類之中,所有的屬性一旦定義了實際上内容都交由各自的堆記憶體空間所儲存。

範例:定義一個程式類,觀察傳統操作的問題

class person {             //建立所有同一個國家的類
    private String name ;
    private int age ;
    String country = “中華民國” ;     //暫時不封裝
    public Person(String name ,int age ){
        this.name = name ;
        this.age = age ;
    }
//setter、getter略
    public String getInfo() {
        return  “姓名:” + this.name + “、年齡:” +this.age + “、國家:” +this.country + ;
    }
}
public class JavaDemo {          
    public static void main(String args[]) {
      Person perA = new Person(“張三” ,10) ;
      Person perB = new Person(“李四” ,10) ;
      Person perC = new Person(“王五” ,11) ;
      System.out.println(perA.getInfo()) ;
      System.out.println(perB.getInfo()) ;
      System.out.println(perC.getInfo()) ;
    }
}           
了解超然物外的static-屬性篇 | 帶你學《Java面向對象程式設計》之十

圖一 執行結果一

為了更好的觀察出程式的問題,下面對此操作做一個記憶體分析。

了解超然物外的static-屬性篇 | 帶你學《Java面向對象程式設計》之十

圖二 記憶體分析一

在正常開發過程之中每一個對象要儲存有各自的屬性,是以此時的程式沒有任何問題。但是當“中華民國”變為“中華人民共和國”,且已經産生了5000W個對象,那麼這将是一個大麻煩。我們先去修改一下代碼。

修改代碼:

public class JavaDemo {          
    public static void main(String args[]) {
      Person perA = new Person(“張三” ,10) ;
      Person perB = new Person(“李四” ,10) ;
      Person perC = new Person(“王五” ,11) ;
      perA.country = “中華人民共和國” ;
      System.out.println(perA.getInfo()) ;
      System.out.println(perB.getInfo()) ;
      System.out.println(perC.getInfo()) ;
    }
}           
了解超然物外的static-屬性篇 | 帶你學《Java面向對象程式設計》之十

圖三 執行結果二

可以看出隻有一個結果的改變,因為每一個對象都擁有各自的country屬性,是以這個時候就會發現從整體的設計上就出現了問題(重複儲存資料并且修改不友善)。

那麼這個時候最好的解決方案就是将country修改為公共屬性,而這種情況下就必須使用static進行标注。

範例:修改Person類定義,使用static定義公共屬性

在上述已修改代碼的基礎上接着進行修改

static String country = “中華民國” ;     //暫時不封裝           
了解超然物外的static-屬性篇 | 帶你學《Java面向對象程式設計》之十

圖四 執行結果三

此時會發現所有對象的country屬性的内容都發生了改變,是以這是一個公共屬性。而此時的記憶體關系圖是怎樣呢?

了解超然物外的static-屬性篇 | 帶你學《Java面向對象程式設計》之十

圖五 記憶體分析二

但是對于static屬性的通路需要注意一點:由于其本身是一個公共的屬性,雖然可以通過對象進行通路,但是最好的做法是通過所有對象的最高代表(類)來進行通路,是以static屬性可以由類名稱直接調用。

Person.country = “中華人民共和國” ;

Static屬性雖然定義在類之中,但是其并不受到類執行個體化對象的控制。static屬性可以在沒有執行個體化對象的時候使用。

範例:不産生執行個體化對象調用static屬性

class person {             //建立所有同一個國家的類
   private String name ;
   private int age ;
   static String country = “中華民國” ;     //暫時不封裝
   public Person(String name ,int age ){
       this.name = name ;
       this.age = age ;
   }
  //setter、getter略
  public String getInfo() {
      return  “姓名:” + this.name + “、年齡:” +this.age + “、國家:” +this.country + ;
   }
}
public class JavaDemo {          
    public static void main(String args[]) {
      System.out.println(Person.country) ;
      Person.country = “中華人民共和國”
      Person per = new Person(“張三”,10) ;
      System.out.println(per.getInfo()) ;
   }
}           
了解超然物外的static-屬性篇 | 帶你學《Java面向對象程式設計》之十

圖六 執行結果四

在以後進行類設計的時候,首選的一定是非static屬性,而我們考慮到公共資訊存儲的時候才會用到static,非static屬性必須在執行個體化對象産生之後才可以使用,而static屬性可以在沒有執行個體化對象産生的情況下直接通過類名稱進行調用。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:了解超然物外的static-方法篇 | 帶你學《Java面向對象程式設計》之十一 更多Java面向對象程式設計文章檢視此處