棟哥帶你學Java static的用法
阿新 • • 發佈:2019-02-10
一、封裝
在說static關鍵詞的用法之前我們先說說Java面向物件的三大特徵之一的封裝.
什麼是封裝?
講類中的屬性或方法對外界隱藏,然後開放公共的訪問方式.
那麼怎麼隱藏呢?
之前我們寫main函式或者別的什麼方法的時候,前面是不是都寫了public啊,這個public是許可權修飾符,表示公開的.那麼私有的怎麼寫呢?private表示私有(許可權修飾符)
貓類程式碼:
public class Cat {
String name; // 貓名
String color; // 顏色
String type; // 種類
public void sayHi() {
System.out.println(name + " " + color + " " + type);
}
}
如果想把把成員變數或者方法隱藏,那麼就按照上面這麼來寫.
說到封裝,那麼我們又要說兩個方法,get和set方法.上面已經說了屬性或方法堆外界隱藏,開放公共的訪問方式.空開公共的訪問方式就需要用到get和set方法.
那麼什麼是get和set方法呢?請先看下列程式碼:
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具體參考我的這篇部落格.