【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
2021/9/4/18:37
文章目錄
- 1、一般情況下類的創(chuàng)建
- 2.一般情況下類創(chuàng)建產(chǎn)生的問(wèn)題
- 2.1、第一種情況如何使用static解決
- 2.2、第二種情況如何使用static解決
- 3.如何調(diào)用static修飾的屬性或方法
- 4.靜態(tài)變量、方法和非靜態(tài)變量、方法之間的調(diào)用問(wèn)題
- 5、有關(guān)static相關(guān)的案例
- 6、靜態(tài)代碼塊
- 7、靜態(tài)代碼塊的作用以及需要注意的細(xì)節(jié)
1、一般情況下類的創(chuàng)建
一般情況下,只有當(dāng)我們執(zhí)行new來(lái)創(chuàng)建對(duì)象時(shí),才能為數(shù)據(jù)分配存儲(chǔ)空間;其中的方法或者屬性才能被外界調(diào)用
2.一般情況下類創(chuàng)建產(chǎn)生的問(wèn)題
有兩種情況是上面無(wú)法解決的。第一種情況就是為某一特定域分配單一的存儲(chǔ)空間(域也可以理解為類屬性),不去考慮究竟要?jiǎng)?chuàng)建多少對(duì)象;第二種情況是希望某個(gè)方法不與類的任何對(duì)象聯(lián)系在一起,也就是即使沒(méi)有創(chuàng)建對(duì)象,也依舊可以調(diào)用這個(gè)方法。
2.1、第一種情況如何使用static解決
如上圖所示,nation變量的值永遠(yuǎn)為china,創(chuàng)建一兩個(gè)對(duì)象還可以,如果創(chuàng)建了上百個(gè)對(duì)象,那么是不是很浪費(fèi)資源。所以我們可以使用靜態(tài)關(guān)鍵字static進(jìn)行標(biāo)識(shí)該變量,就會(huì)變成如下
這就是使用static解決第一種情況(為特定域分配單一的存儲(chǔ)空間),這靜態(tài)區(qū)里的變量隨著類的加載就存在了。在程序的整個(gè)運(yùn)行過(guò)程中都存在,當(dāng)程序結(jié)束時(shí),由系統(tǒng)進(jìn)行清除。(因此由static修飾的屬性也可以成為全局變量)
2.2、第二種情況如何使用static解決
第二種情況我們都遇到過(guò),比如工具類某某Utils,我們一般都是在其他類中直接類名.方法直接調(diào)用;
使用static修飾也要注意很多,不能過(guò)多的使用static修飾變量或者方法,因?yàn)閟tatic修飾的變量或方法是屬于類層級(jí)的,雖然類的加載而分配存儲(chǔ)空間,因此,你的static方法或者屬性越多,在一開(kāi)始就會(huì)分配固定的內(nèi)存空間,那么大部分的內(nèi)存空間分配給了static,剩下的內(nèi)存空間就不多了,就會(huì)造成內(nèi)存負(fù)擔(dān)。
public static void main(String[] args) {..........}static方法在不創(chuàng)建對(duì)象的情況下就可以通過(guò)類名調(diào)用,這對(duì)于main方法很重要,main方法是運(yùn)行一個(gè)應(yīng)用的入口點(diǎn)。
3.如何調(diào)用static修飾的屬性或方法
1.類名.屬性
class Test{static String num = 1; } Test.num = 2;2.引用.屬性
Test test = new Test(); test.num = 2;由于靜態(tài)修飾的方法或?qū)傩允穷悓蛹?jí)的,隨著類的加載而出現(xiàn),所以通過(guò)類名.方法調(diào)用應(yīng)該都會(huì)明白;那么通過(guò)引用調(diào)用靜態(tài)變量該怎么理解呢?
這是因?yàn)閟tatic修飾的變量或方法是被類的所有對(duì)象共享的,也就是其中任何一個(gè)對(duì)象都可以調(diào)用進(jìn)行修改。
4.靜態(tài)變量、方法和非靜態(tài)變量、方法之間的調(diào)用問(wèn)題
1.無(wú)法在靜態(tài)方法中調(diào)用非靜態(tài)變量
這是因?yàn)殪o態(tài)方法是隨著類的加載而加載,非靜態(tài)變量是new該類對(duì)象時(shí)而加載;前者出現(xiàn)過(guò)早,根本無(wú)法加載到其中的非靜態(tài)變量。
2.非靜態(tài)方法可以調(diào)用靜態(tài)變量
和第一個(gè)類似,靜態(tài)變量首先出現(xiàn),輪到加載非靜態(tài)方法時(shí)當(dāng)然可以得到
3.無(wú)法在靜態(tài)方法中調(diào)用非靜態(tài)方法,可以在靜態(tài)方法中調(diào)用非靜態(tài)方法
總之,只要牢牢記住靜態(tài)和非靜態(tài)的加載順序就很容易理解了。
5、有關(guān)static相關(guān)的案例
class StaticTest {static int num = 10; } StaticTest test1 = new StaticTest(); StaticTest test2 = new StaticTest(); test1.num++; System.out.println(test2.num);結(jié)果:11
只要記住static修飾的變量被類的所有對(duì)象共享,那么這一類的題就會(huì)很容易就能解決!
6、靜態(tài)代碼塊
首先靜態(tài)代碼塊隨著類的加載而執(zhí)行,而且只運(yùn)行一次;如果由多個(gè)靜態(tài)代碼塊,會(huì)按照順序來(lái)執(zhí)行。
看下面一段代碼是否在你的意料之中
public class StaticTest {static {System.out.println("靜態(tài)代碼塊執(zhí)行....");System.out.println(country);}private static String country = "china";public static void main(String[] args) {System.out.println(country);} }結(jié)果
當(dāng)我該變順序之后
結(jié)果:
所以當(dāng)在靜態(tài)代碼塊中調(diào)用靜態(tài)變量時(shí),一定要將定義靜態(tài)變量的位置放在靜態(tài)代碼塊之前。
7、靜態(tài)代碼塊的作用以及需要注意的細(xì)節(jié)
如果一些代碼在項(xiàng)目啟動(dòng)時(shí)就要執(zhí)行并且只需要執(zhí)行一次,那么就可以放到靜態(tài)代碼塊中。比如我們啟動(dòng)一個(gè)項(xiàng)目要加載相應(yīng)的配置文件,那么我們就可以將其放到靜態(tài)代碼塊中
需要注意的細(xì)節(jié)
1.靜態(tài)代碼塊不能出現(xiàn)在任何方法當(dāng)中
無(wú)論是靜態(tài)方法還是非靜態(tài)方法都是如此
對(duì)于非靜態(tài)方法,這個(gè)很好理解,因?yàn)殪o態(tài)代碼塊是在類加載之后就能運(yùn)行的;而非靜態(tài)方法只能在new完對(duì)象之后,通過(guò)對(duì)象才能運(yùn)行這個(gè)方法
對(duì)于靜態(tài)方法,在類加載時(shí),雖然靜態(tài)方法也加載了,但是靜態(tài)方法必須通過(guò)類名或者對(duì)象名才能訪問(wèn)。也就是說(shuō)靜態(tài)方法是被動(dòng)運(yùn)行的,靜態(tài)代碼塊是主動(dòng)運(yùn)行的。
2、靜態(tài)代碼塊不能訪問(wèn)普通變量
這個(gè)應(yīng)該就不用說(shuō)了。需要注意的是靜態(tài)代碼塊中能夠訪問(wèn)靜態(tài)變量,但必須將靜態(tài)變量的位置放在靜態(tài)代碼塊前面。
2021/9/4/22:43
總結(jié)
以上是生活随笔為你收集整理的【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网站如何接入微信支付功能?微信支付详细教
- 下一篇: 整理Java相关的工具类Utils,持续