1. 程式人生 > >Java學習筆記之static關鍵字

Java學習筆記之static關鍵字

Java裡可以使用static宣告屬性或者方法,對於非static的屬性和方法,每個物件都佔有各自的內容,如果想要有一個方法或者屬性為所有物件所共有,可以宣告為static型別,聲明瞭static型別的屬性或方法之後,此方法也稱為類方法,可以由類名直接呼叫。

1、使用static宣告屬性

static可以宣告全域性屬性,全域性屬性有什麼作用呢?看一下如下程式碼

public class Demo5 {
    public static void main(String[] args) {
        Person p1 = new Person("張三", 30);
Person p2 = new Person("李四", 31); Person p3 = new Person("王五", 32); p1.getInfo(); p2.getInfo(); p3.getInfo(); System.out.println("----------- 修改 p1 的country 屬性 ----------"); p1.country = "B城"; p1.getInfo(); p2.getInfo(); p3.
getInfo(); } } class Person{ String name; // 宣告name屬性,暫時不封裝 int age; // 宣告age 屬性,暫時不封裝 String country="A城"; // 宣告country屬性,給預設值 public Person(String name, int age){ this.name = name; this.age = age; } public void getInfo(){ System.out.println(
"姓名:" + this.name + " 年齡:" + this.age + " 城市:" + country); } } 執行結果: 姓名:張三 年齡:30 城市:A城 姓名:李四 年齡:31 城市:A城 姓名:王五 年齡:32 城市:A城 ----------- 修改 p1 的country 屬性 ---------- 姓名:張三 年齡:30 城市:B城 姓名:李四 年齡:31 城市:A城 姓名:王五 年齡:32 城市:A城

我們看到,上面的程式基本實現了我們想要的功能,但是當改變country屬性的時候,只有明確修改屬性的p1改變了,p2,p3都沒變,如果只有幾個物件,我們打不了逐個修改,但是如果物件有成千上萬個,那逐個修改就是非常耗時耗力的重複工作,這個時候,我們就可以用static關鍵字來處理,只要把country屬性宣告為static就行

public class Demo5 {
    public static void main(String[] args) {
        Person p1 = new Person("張三", 30);
        Person p2 = new Person("李四", 31);
        Person p3 = new Person("王五", 32);
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();
        System.out.println("----------- 修改 p1 的country 屬性 ----------");
        p1.country = "B城";
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();
    }
}

class Person{

    String name;  // 宣告name屬性,暫時不封裝
    int age;      // 宣告age 屬性,暫時不封裝
    String country="A城";  // 宣告country屬性,給預設值

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void getInfo(){
        System.out.println("姓名:" + this.name + " 年齡:" + this.age + " 城市:" + country);
    }
}

執行結果:
姓名:張三 年齡:30 城市:A城
姓名:李四 年齡:31 城市:A城
姓名:王五 年齡:32 城市:A城
----------- 修改 p1 的country 屬性 ----------
姓名:張三 年齡:30 城市:B城
姓名:李四 年齡:31 城市:B城
姓名:王五 年齡:32 城市:B城

可以看到,修改一個物件的country屬性值,所有物件的country屬性都發生改變,這表明這個country屬性是所有物件所共享的

記憶體關係

說到這裡,順便提一下Java的記憶體區域

  • 棧記憶體:可以儲存物件的名稱
  • 堆記憶體:每個物件的具體屬性
  • 全域性資料區:儲存static型別的屬性
  • 全域性程式碼區:儲存所有方法的定義

再回來看一下剛才的程式碼,在修改static屬性的時候,我們用的是 物件.屬性=" "來修改,這種方式其實不推薦,最好是用 “類名稱 . 屬性” 來修改。

2、使用static宣告方法

public class Demo5 {
    public static void main(String[] args) {
        Person p1 = new Person("張三", 30);
        Person p2 = new Person("李四", 31);
        Person p3 = new Person("王五", 32);
        System.out.println("----------- 修改前 ------------");
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();
        Person.setCountry("B城");  // 呼叫靜態方法修改country屬性
        System.out.println("----------- 修改後 ------------");
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();

    }
}

class Person{

    private String name;  // 宣告name屬性
    private int age;      // 宣告age 屬性
    private static String country="A城";  // 宣告country屬性,給預設值

    public static String getCountry() {
        return country;
    }

    public static void setCountry(String country) {
        Person.country = country;
    }

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void getInfo(){
        System.out.println("姓名:" + this.name + " 年齡:" + this.age + " 城市:" + country);
    }

}

執行結果:
----------- 修改前 ------------
姓名:張三 年齡:30 城市:A城
姓名:李四 年齡:31 城市:A城
姓名:王五 年齡:32 城市:A城
----------- 修改後 ------------
姓名:張三 年齡:30 城市:B城
姓名:李四 年齡:31 城市:B城
姓名:王五 年齡:32 城市:B城

注意:靜態方法不能呼叫非靜態屬性或方法