天天看點

成員變量和類變量的差別

  • 成員變量和類變量的差別

由static修飾的變量稱為靜态變量,其實質上就是一個全局變量。如果某個内容是被所有對象所共享,那麼該内容就應該用靜态修飾;沒有被靜态修飾的内容,其實是屬于對象的特殊描述。

不同的對象的執行個體變量将被配置設定不同的記憶體空間, 如果類中的成員變量有類變量,那麼所有對象的這個類變量都配置設定給相同的一處記憶體,改變其中一個對象的這個類變量會影響其他對象的這個類變量,也就是說對象共享類變量。

   1、兩個變量的生命周期不同

      成員變量随着對象的建立而存在,随着對象的回收而釋放。

      靜态變量随着類的加載而存在,随着類的消失而消失。

   2、調用方式不同

      成員變量隻能被對象調用。

      靜态變量可以被對象調用,還可以被類名調用。

   3、别名不同

      成員變量也稱為執行個體變量。

      靜态變量也稱為類變量。

   4、資料存儲位置不同

      成員變量存儲在堆記憶體的對象中,是以也叫對象的特有資料。

      靜态變量資料存儲在方法區(共享資料區)的靜态區,是以也叫對象的共享資料。

  • static 關鍵字,是一個修飾符,用于修飾成員(成員變量和成員函數)。

   特點:

   1、想要實作對象中的共性資料的對象共享。可以将這個資料進行靜态修飾。

   2、被靜态修飾的成員,可以直接被類名所調用。也就是說,靜态的成員多了一種調用方式。類名.靜态方式。

    3、靜态随着類的加載而加載。而且優先于對象存在。

弊端:

   1、有些資料是對象特有的資料,是不可以被靜态修飾的。因為那樣的話,特有資料會變成對象的共享資料。這樣對事物的描述就出了問題。是以,在定義靜态時,必須要明确,這個資料是否是被對象所共享的。

   2、靜态方法隻能通路靜态成員,不可以通路非靜态成員。

      因為靜态方法加載時,優先于對象存在,是以沒有辦法通路對象中的成員。

   3、靜态方法中不能使用this,super關鍵字。

      因為this代表對象,而靜态在時,有可能沒有對象,是以this無法使用。

  • 什麼時候定義靜态成員呢?或者說:定義成員時,到底需不需要被靜态修飾呢?

成員分兩種:

   1、成員變量。(資料共享時靜态化)

      該成員變量的資料是否是所有對象都一樣:

      如果是,那麼該變量需要被靜态修飾,因為是共享的資料。 

      如果不是,那麼就說這是對象的特有資料,要存儲到對象中。 

   2、成員函數。(方法中沒有調用特有資料時就定義成靜态)

      如果判斷成員函數是否需要被靜态修飾呢?

      隻要參考,該函數内是否通路了對象中的特有資料:

      如果有通路特有資料,那方法不能被靜态修飾。

      如果沒有通路過特有資料,那麼這個方法需要被靜态修飾。

  • 成員變量和靜态變量的差別

   1、成員變量所屬于對象。是以也稱為執行個體變量。

      靜态變量所屬于類。是以也稱為類變量。

   2、成員變量存在于堆記憶體中。

      靜态變量存在于方法區中。

   3、成員變量随着對象建立而存在。随着對象被回收而消失。

      靜态變量随着類的加載而存在。随着類的消失而消失。

   4、成員變量隻能被對象所調用 。

      靜态變量可以被對象調用,也可以被類名調用。

   是以,成員變量可以稱為對象的特有資料,靜态變量稱為對象的共享資料。

轉自:http://www.runoob.com/java/java-object-classes.html