1. 程式人生 > >棟哥帶你學Java static的用法

棟哥帶你學Java static的用法

一、封裝
在說static關鍵詞的用法之前我們先說說Java面向物件的三大特徵之一的封裝.
什麼是封裝?
講類中的屬性或方法對外界隱藏,然後開放公共的訪問方式.
那麼怎麼隱藏呢?
之前我們寫main函式或者別的什麼方法的時候,前面是不是都寫了public啊,這個public是許可權修飾符,表示公開的.那麼私有的怎麼寫呢?private表示私有(許可權修飾符) 
貓類程式碼:
public class Cat {
    String name;    // 貓名
    String color;   // 顏色   
    String type;    // 種類
    public void
sayHi() { System.out.println(name + " " + color + " " + type); } } 如果想把把成員變數或者方法隱藏,那麼就按照上面這麼來寫. 說到封裝,那麼我們又要說兩個方法,getset方法.上面已經說了屬性或方法堆外界隱藏,開放公共的訪問方式.空開公共的訪問方式就需要用到getset方法. 那麼什麼是getset方法呢?請先看下列程式碼: public class Cat { private String name; // 貓名 private String color; // 顏色 private
String type; // 種類 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public String getType
() { return type; } public void setType(String type) { this.type = type; } } get/set方法是對成員變數使用的,然後在別的類中,如何想要初始化成員變數那麼就得這麼寫. Cat cat = new Cat(); cat.setName("小花貓"); System.out.println(cat.getName()); 結果:小花貓 因為private的原因,別的類裡面是呼叫不到這個類裡面的成員變數的值的,只能靠get/set方法來修改和獲取成員變數的值. 說到get/set方法,我們有能看到裡面有this這個關鍵詞.這個this又是幹嘛用的呢? 其實this代表的就是你例項化出來的那個物件.就像我剛剛寫的Cat cat = new Cat();那麼this就表示我例項化出來的cat.
二、static
static就是靜態的意思,寫在變數的前面就稱那個變數為靜態變數,寫在方法前面我們就叫靜態方法.
那麼它有什麼特點呢?
特點:隨著類的建立而存在,隨著類的銷燬而銷燬(程式結束).
注意:在靜態方法中沒有this這個關鍵詞.
public class Cat {
    private String name;    // 貓名
    private String color;   // 顏色   
    private String type;    // 種類

    public static void test() {
        System.out.println("測試static");
    }
}
還是這個貓類,我們再寫一個貓的測試類來測試我們的static修飾的test方法.
public class CatTest {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.test();
    }
}
執行結果:測試static
但是我們會發現cat.test();這一行會有黃色的警告,這是為什麼呢?
在前面類和物件的部落格中我已經說了,在java中先有類才有的物件.既然test方法是貓類中的,那麼我們也可以這麼呼叫.Cat.test();然後就會發現不報黃了.不管我們建立或者不建立一個物件,我們都可以呼叫這個方法.所以,我們正常的寫法就是類名點靜態方法,當然用物件點靜態方法也是可以的,但是畢竟先有類,才有的物件,可以理解成先入為主思想吧. 
那麼我現在在貓類和貓類的測試類裡面再多加幾行程式碼.
public class CatTest {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.type = "波斯貓";
    }
}
public class Cat {
    static String name;    // 貓名
    static String color;// 顏色   
    static String type; // 種類

    public static void test() {
        System.out.println("測試static");
    }
}
那麼這段程式碼在記憶體中怎麼表示呢?先看下面這張圖

這裡寫圖片描述

之前我們直說了棧記憶體和堆記憶體,但是今天說到static就必須把方法區也說了.方法區是在棧記憶體和堆記憶體之前執行的.先載入位元組碼檔案,也就是.class檔案.然後根據當前用到的類都給載入進去.我現在就寫了一個貓類和貓的測試類所以這兩個.class檔案就被載入到方法區.然後每個.class載入完後就開闢一個空間,每個空間一邊存放靜態成員變數和靜態成員方法,另一邊存在靜態的.然後後面的步驟就跟之前陣列講法一樣.http://blog.csdn.net/koseun/article/details/78965417具體參考我的這篇部落格.