靜態(tài)變量只能賦值一次 靜態(tài)變量不是不能被重新初始化賦值嗎?
靜態(tài)變量不是不能被重新初始化賦值嗎?靜態(tài)變量只存在于本地函數(shù)域中,但當(dāng)程序執(zhí)行離開此域時(shí),它們的值不會(huì)丟失。聲明方法是:static$name=value,其中static是聲明靜態(tài)變量的關(guān)鍵字,$n
靜態(tài)變量不是不能被重新初始化賦值嗎?
靜態(tài)變量只存在于本地函數(shù)域中,但當(dāng)程序執(zhí)行離開此域時(shí),它們的值不會(huì)丟失。聲明方法是:static$name=value,其中static是聲明靜態(tài)變量的關(guān)鍵字,$name是變量的名稱,value是變量的值。&是嗎?Phpfunctiontest(){static$AA=0echo$AA$AA}?>變量$AA在第一次調(diào)用test()函數(shù)時(shí)初始化。每次調(diào)用test()函數(shù)時(shí),都會(huì)輸出$AA的值并加上1
當(dāng)一個(gè)類的數(shù)據(jù)成員聲明為static時(shí),靜態(tài)數(shù)據(jù)成員只能定義一次并由同一個(gè)類的所有對(duì)象共享。每個(gè)對(duì)象都有類中每個(gè)普通數(shù)據(jù)成員的一個(gè)副本,但靜態(tài)數(shù)據(jù)成員只存在一個(gè)實(shí)例,而不管定義了多少個(gè)類對(duì)象。靜態(tài)數(shù)據(jù)成員的目的之一是統(tǒng)計(jì)實(shí)際存在的對(duì)象數(shù)。靜態(tài)數(shù)據(jù)成員不能在類中初始化。實(shí)際上,類定義只用于描述對(duì)象的藍(lán)圖,其中不允許指定初始值。無法在函數(shù)中初始化靜態(tài)數(shù)據(jù)成員,因?yàn)殪o態(tài)數(shù)據(jù)成員由類的所有對(duì)象共享,因此每次創(chuàng)建類的對(duì)象時(shí),都會(huì)重新初始化靜態(tài)數(shù)據(jù)成員。
為什么靜態(tài)成員變量要通過類外初始化賦值?
1. 靜態(tài)變量:線程不安全。靜態(tài)變量,即類變量,位于方法區(qū)域中。它們被所有對(duì)象共享并共享一部分內(nèi)存。修改靜態(tài)變量后,其他對(duì)象對(duì)修改是可見的,因此線程是不安全的。
2. 實(shí)例變量:單例模式(只存在一個(gè)對(duì)象實(shí)例)是線程不安全和非單例線程安全的。實(shí)例變量是對(duì)象實(shí)例的私有變量,并在虛擬機(jī)堆中分配。如果這個(gè)對(duì)象在系統(tǒng)中只有一個(gè)實(shí)例,那么在多線程環(huán)境中,“就像”這個(gè)靜態(tài)變量,被一個(gè)線程修改后,其他線程都能看到修改,所以線程是不安全的。如果每個(gè)線程在不同的對(duì)象中執(zhí)行,那么對(duì)象和對(duì)象之間的實(shí)例變量是不安全的,修改不會(huì)相互影響,因此線程安全。
3. 局部變量:線程安全。當(dāng)每個(gè)線程執(zhí)行時(shí),它會(huì)將局部變量放在自己的堆棧幀的工作內(nèi)存中,這在線程之間是不共享的,因此不存在線程安全問題。
靜態(tài)變量,實(shí)例變量,局部變量線程安全嗎,為什么?
可以修改Java靜態(tài)變量。對(duì)于任何變量,其值都可以更改。眾所周知,javastatic中使用的靜態(tài)變量可以基于一個(gè)類創(chuàng)建多個(gè)對(duì)象。每個(gè)對(duì)象都有自己的成員,并且相互獨(dú)立。但是,在某些情況下,我們更希望這個(gè)類中的所有對(duì)象共享同一個(gè)成員。是時(shí)候讓靜秀一下了。在Java中,由static修改的成員稱為靜態(tài)成員或類成員。它屬于整個(gè)類,而不是一個(gè)對(duì)象,也就是說,它被類的所有對(duì)象共享。靜態(tài)成員可以通過使用類名或?qū)ο竺苯釉L問。當(dāng)然,由于其角色的特殊性,建議使用類名訪問~~靜態(tài)可以修改變量、方法和代碼塊。例如,我們?cè)陬愔卸x了一個(gè)靜態(tài)變量hobby,操作代碼如下:注意靜態(tài)成員屬于整個(gè)類。當(dāng)系統(tǒng)第一次使用該類時(shí),它將為該類分配內(nèi)存空間,并且在卸載該類之前不會(huì)回收資源。