-
成員變量和類變量的差別
由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