1. 程式人生 > >二、Java面向對象(5)_static修飾符

二、Java面向對象(5)_static修飾符

name 類方法 oid static成員 public span 需要 方法區 AS

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修飾符