一、static關鍵字
引入:
我們之前定義了很多成員變量(name ,age,sex)成員變量其實我們只寫了一份,但是發現每個對象都可以用,就說明Java中這些成員變量或者方法是存在所屬性的。
有些是屬於對象的,有些是屬於類本身的。
Java是通過成員變量是否有static修飾來區分是類的還是屬於對象的。
static 含義爲 靜態
其修飾的成員(方法和成員變量)是屬於類本身的,
沒有修飾的成員屬於對象。
成員變量:
-
(1)靜態成員變量(類變量) :
有static修飾的成員變量稱爲靜態成員變量也叫類變量,屬於類本身的,直接用類名訪問即可。 -
(2)實例成員變量
無static修飾的成員變量稱爲實例成員變量,屬於類的每個對象的,必須用類的對象來訪問。
成員方法:
(1)靜態方法
有static修飾的成員方法稱爲靜態方法也叫類方法,屬於類本身的,直接用類名訪問即可。
(2)實例方法
無static修飾的成員方法稱爲實例方法,屬於類的每個對象的,必須用類的對象來訪問。
小結:
成員變量有2種
- 有static修飾的屬於類叫靜態成員變量,與類一起加載一次, 直接用類名調用即可。
- 無static修飾的屬於類的每個對象的叫實例成員變量,與類的對象一起加載,對象有多少個,實例成員變量就加載多少份。必須用類的對象調用。
成員方法有2種:
- 有static修飾的屬於類叫靜態方法,直接用類名調用即可。
- 無static修飾的屬於類的每個對象的叫實例方法,必須用類的對象調用。
二、成員變量的分類和訪問
按照有無static修飾成員變量分爲:
- (1)靜態成員變量:有static修飾,屬於類本身與類一起加載一次, 直接用類名訪問即可。
- (2)實例成員變量:無static修飾,屬於類的每個對象的,必須先創建對象,再用對象來訪問。
靜態成員變量訪問:
- 類名.靜態成員變量。
- 對象.靜態成員變量。(不推薦)
實例成員變量的訪問:
- 對象.實例成員變量
public class Demo1 {
// 1.靜態成員變量:有static修飾, 屬於類本身,直接用類名訪問即可
public static String abcname = "abc";
// 2.實例成員變量:無static修飾, 屬於類的對象的,必須用對象訪問
private String name;
private int age;
public static void main(String[] args) {
//1.類名.成員變量
System.out.println(Demo1.abcname);
//同一個類中訪問靜態成員變量可以省略類名不寫
System.out.println(abcname);
//2.對象.實例成員
System.out.println(name);//報錯
Demo1 d1 = new Demo1();
d1.name = "efg";
d1.age = 22;
//3.對象。靜態成員變量(不推孝)
//靜態成員變量屬於類,直接用類名訪問即可。
System.out.println(d1.abcname);
}
}
小結:
- 靜態成員變量有static修飾,屬於類本身,與類加載一次, 因爲只有一份所以可以被類和類的對象共同訪問。
注意:不建議用對象訪問靜態成員變量,靜態成員變量直接用類名訪問即可 - 實例成員變量,無static修飾,屬於類的對象的,必須先創建對象,然後用對象來訪問,否則報錯
三、成員方法的分類
成員方法按照有無static修飾可以分爲:
- (1)靜態方法:有static修飾, 屬於類,直接用類名訪問即可。
- (2)實例方法:無static修飾, 屬於對象的,必須用對象來訪問。
靜態方法的訪問格式:
類名.靜態方法
對象.靜態方法(不推薦)
實例方法的訪問格式:
對象.實例方法
public class Demo2 {
private String name;
private int age;
public static void eat(){
System.out.println("靜態方法喫飯");
}
public void show(){
System.out.println(name+age+"實例方法喫飯");
}
public static void main(String[] args) {
//1.靜態方法
eat();
Demo2.eat();
//2.實例方法,要用對象訪問
// show();報錯
Demo2 d2 = new Demo2();
d2.name = "abc";
d2.age = 22;
d2.show();
}
}
小結:
-
靜態方法屬於類,有static修飾,直接用類名訪問即可。
-
實例方法屬於對象,無static修飾,必須先創建對象,然後用對象來訪問。
-
靜態方法也可以被對象共享訪問,但是不推薦,因爲靜態方法直接用類名訪問即可。