static關鍵字
1 概述
定義如下類:
public class Student {
// 成員變數
public String name;
public char sex; // '男' '女'
public int age;
// 無引數構造方法
public Student() {
}
// 有引數構造方法
public Student(String a) {
}
}
已經知道物件導向中,存在類和物件的概念,在類中定義了一些成員變數,例如name,age,sex ,結果發現這些成員變數,每個物件都存在(因為每個物件都可以訪問)。
而像name ,age , sex確實是每個學生物件都應該有的屬性,應該屬於每個物件。
所以Java中成員(變數和方法)等是存在所屬性的,Java是透過static關鍵字來區分的。static關鍵字在Java開發非常的重要,對於理解物件導向非常關鍵。
關於 static
關鍵字的使用,它可以用來修飾的成員變數和成員方法,被static修飾的成員是屬於類的是放在靜態區中,沒有static修飾的成員變數和方法則是屬於物件的。我們上面案例中的成員變數都是沒有static修飾的,所以屬於每個物件。
2 定義格式和使用
static是靜態的意思。 static可以修飾成員變數或者修飾方法。
2.1 靜態變數及其訪問
有static修飾成員變數,說明這個成員變數是屬於類的,這個成員變數稱為類變數或者靜態成員變數。 直接用 類名訪問即可。因為類只有一個,所以靜態成員變數在記憶體區域中也只存在一份。所有的物件都可以共享這個變數。
如何使用呢
例如現在我們需要定義傳智全部的學生類,那麼這些學生類的物件的學校屬性應該都是“傳智”,這個時候我們可以把這個屬性定義成static修飾的靜態成員變數。
定義格式
修飾符 static 資料型別 變數名 = 初始值;
舉例
public class Student {
public static String schoolName = "傳智播客"; // 屬於類,只有一份。
// .....
}
靜態成員變數的訪問:
格式:類名.靜態變數
public static void main(String[] args){
System.out.println(Student.schoolName); // 傳智播客
Student.schoolName = "黑馬程式設計師";
System.out.println(Student.schoolName); // 黑馬程式設計師
}
2.2 例項變數及其訪問
無static修飾的成員變數屬於每個物件的, 這個成員變數叫例項變數,之前我們寫成員變數就是例項成員變數。
需要注意的是:例項成員變數屬於每個物件,必須建立類的物件才可以訪問。
格式:物件.例項成員變數
2.3 靜態方法及其訪問
有static修飾成員方法,說明這個成員方法是屬於類的,這個成員方法稱為類方法或者靜態方法**。 直接用 類名訪問即可。因為類只有一個,所以靜態方法在記憶體區域中也只存在一份。所有的物件都可以共享這個方法。
與靜態成員變數一樣,靜態方法也是直接透過類名.方法名稱即可訪問。
舉例
public class Student{
public static String schoolName = "傳智播客"; // 屬於類,只有一份。
// .....
public static void study(){
System.out.println("我們都在黑馬程式設計師學習");
}
}
靜態成員變數的訪問:
格式:類名.靜態方法
public static void main(String[] args){
Student.study();
}
2.4 例項方法及其訪問
無static修飾的成員方法屬於每個物件的,這個成員方法也叫做例項方法。
需要注意的是:例項方法是屬於每個物件,必須建立類的物件才可以訪問。
格式:物件.例項方法
示例:
public class Student {
// 例項變數
private String name ;
// 2.方法:行為
// 無 static修飾,例項方法。屬於每個物件,必須建立物件呼叫
public void run(){
System.out.println("學生可以跑步");
}
// 無 static修飾,例項方法
public void sleep(){
System.out.println("學生睡覺");
}
public static void study(){
}
}
public static void main(String[] args){
// 建立物件
Student stu = new Student ;
stu.name = "徐幹";
// Student.sleep();// 報錯,必須用物件訪問。
stu.sleep();
stu.run();
}
3 小結
1.當 static
修飾成員變數或者成員方法時,該變數稱為靜態變數,該方法稱為靜態方法。該類的每個物件都共享同一個類的靜態變數和靜態方法。任何物件都可以更改該靜態變數的值或者訪問靜態方法。但是不推薦這種方式去訪問。因為靜態變數或者靜態方法直接透過類名訪問即可,完全沒有必要用物件去訪問。
2.無static修飾的成員變數或者成員方法,稱為例項變數,例項方法,例項變數和例項方法必須建立類的物件,然後透過物件來訪問。
3.static修飾的成員屬於類,會儲存在靜態區,是隨著類的載入而載入的,且只載入一次,所以只有一份,節省記憶體。儲存於一塊固定的記憶體區域(靜態區),所以,可以直接被類名呼叫。它優先於物件存在,所以,可以被所有物件共享。
4.無static修飾的成員,是屬於物件,物件有多少個,他們就會出現多少份。所以必須由物件呼叫。