二、Java面向對象(5)_static修飾符
2018-04-29
樹欲靜而風不止
static修飾符
static修飾符表示靜態的,該修飾符可以修飾字段、方法、內部類。使用該關鍵字修飾的內容,在面向對象中static修飾的內容是隸屬於類,而不是直接隸屬於對象的,所以static修飾的成員變量一般稱作類成員變量,而static修飾的方法一般稱作類方法。
static修飾符的特點:
1)static修飾的成員(字段/方法),隨著所在類的加載而加載。
當JVM把字節碼加載進JVM的時候,static修飾的成員已經在內存中存在了。
2)優先於對象的存在。
對象是我們手動通過new關鍵字創建出來的。
3)satic修飾的成員被該類型的所有對象所共享。
根據該類創建出來的任何對象,都可以訪問static成員。
分析:表面上通過對象去訪問static成員,其本質依然使用類名訪問,和對象沒有任何關系(通過反編譯可以看到)。
4)直接使用類名訪問static成員 。
因為static修飾的成員直接屬於類,不屬於對象,所以可以直接使用類名訪問static成員。
類成員和實例成員的訪問
1)類成員:使用static修飾的成員,直接屬於類,可以通過類來訪問static字段和static方法。
2)實例成員:沒有使用static修飾的成員,只屬於對象,通過對象來訪問非static字段和非static方法(對象其實可以訪問類成員,但是底層依然使用類名訪問的)。
3)static方法中:只能調用static成員。
4)非static方法:可以訪問靜態成員,也可以訪問實例成員。
靜態與非靜態的區別:
(1)
非靜態成員變量又稱為實例變量。
靜態成員變量又稱為類變量。
(2)
非靜態成員變量,隨著對象的創建而存在,隨著對象的消失而消失。
靜態成員變量,隨著類的加載而存在,隨著類的消失而消失。
(3)
非靜態變量存在於對象堆內存中。
靜態變量存在於方法區中。
(4)
非靜態變量只能被對象所調用。
靜態變量可以被類名調用,也可以被對象調用。
什麽時候定義成static的字段和方法:
如果這個一個狀態或行為屬於整個事物(類),就直接使用static修飾,被所有對象所共享。 在開發中,往往把工具方法使用static修飾。如果不使用static修飾,則這些方法屬於該類的對象,我們得先創建對象再調用方法,在開發中工具對象只需要一份即可,可能創建N個對象,此時我們往往把該類設計為單例的,但還是有點麻煩。所以,一般在開發中設計工具方法,為了調用簡單,我們使用static修飾。
static成員在JVM中的存儲:
代碼舉例:
1 class Person
2 {
3 String name;//名字
4 int age;//年紀
5
6 static int totalNum = 5;//人類總人數5
7
8 //構造函數
9 Person(String n, int a){
10 name = n;//將n賦給name
11 age = a;//將a賦給age
12 totalNum++;
13 }
14
15 void die(){
16 totalNum--;
17 System.out.println("死亡");
18 }
19
20 //只有人類才有毀滅
21 static void destory(){
22 totalNum = 0;
23 System.out.println("人類毀滅");
24 }
25 }
26
27
28 //演示static修飾符
29 class PersonDemo2
30 {
31
32 public static void main(String[] args)
33 {
34 System.out.println(Person.totalNum);
35 Person p1 = new Person("張三",10);
36 Person p2 = new Person("李四",5);
37 System.out.println(Person.totalNum);//使用類調用對象
38
39 p2.die();//p2死亡
40 System.out.println(Person.totalNum);
41
42 Person.destory();
43 System.out.println(Person.totalNum);
44 }
45 }
輸出結果:
二、Java面向對象(5)_static修飾符