(1)static 關(guān)鍵字用于修飾變量,方法,和代碼塊;
(2)被static修飾的變量或方法不依賴于特定對(duì)象,可以直接通過類名訪問;
static 變量
(1)靜態(tài)(static)變量與非靜態(tài)變量的區(qū)別是對(duì)于一個(gè)靜態(tài)變量由所有對(duì)象共同維護(hù),靜態(tài)變量在內(nèi)存中只有一個(gè)副本;而對(duì)于非靜態(tài)變量,每個(gè)對(duì)象維護(hù)各自的變量副本,互不影響;
static 方法
(1)static方法一般稱作靜態(tài)方法,由于靜態(tài)方法不依賴于任何對(duì)象就可以進(jìn)行訪問突倍,因此對(duì)于靜態(tài)方法來說俭尖,是沒有this的,因?yàn)樗灰栏接谌魏螌?duì)象桶良,既然都沒有對(duì)象座舍,就談不上this了。并且由于這個(gè)特性艺普,在靜態(tài)方法中不能訪問類的非靜態(tài)成員變量和非靜態(tài)成員方法簸州,因?yàn)榉庆o態(tài)成員方法/變量都是必須依賴具體的對(duì)象才能夠被調(diào)用鉴竭。
(2)因此,如果說想在不創(chuàng)建對(duì)象的情況下調(diào)用某個(gè)方法岸浑,就可以將這個(gè)方法設(shè)置為static搏存。我們最常見的static方法就是main方法,因?yàn)槌绦蛟趫?zhí)行main方法的時(shí)候沒有創(chuàng)建任何對(duì)象,因此只有通過類名來訪問矢洲。
static 代碼塊
(1)static關(guān)鍵字還有一個(gè)比較關(guān)鍵的作用就是 用來形成靜態(tài)代碼塊以優(yōu)化程序性能璧眠。static塊可以置于類中的任何地方,類中可以有多個(gè)static塊读虏。在類初次被加載的時(shí)候责静,會(huì)按照static塊的順序來執(zhí)行每個(gè)static塊,并且只會(huì)執(zhí)行一次盖桥。
(2)看Test.java源碼,分析輸出;程序首先找到main方法入口,創(chuàng)建Test對(duì)象前先加載Test類,發(fā)現(xiàn)Test類繼承Base類,轉(zhuǎn)而加載Base類,加載Base類時(shí),執(zhí)行static代碼塊的語句,輸出"Base static";繼而加載Test類,執(zhí)行static代碼塊,輸出"Test static";然后創(chuàng)建Test之前,先執(zhí)行父類的構(gòu)造函數(shù),輸出"Base constructor";最后執(zhí)行Test的構(gòu)造函數(shù),輸出"Test construntor";
因此輸出順序:Base static , Test static , Base constructor , Test constructor ;
(3)
查看Test.java_2源碼,分析輸出;首先加載Test類,執(zhí)行static塊,輸出"test static";進(jìn)入main入口,創(chuàng)建MyClass對(duì)象前,加載MyClass類,發(fā)現(xiàn)MyClass類繼承Test類,而Test類已被加載,因此執(zhí)行MyClass的static代碼塊,輸出"myclass static" ;接下來創(chuàng)建MyClass對(duì)象,創(chuàng)建之前必須先初始化父類的成員變量,因此執(zhí)行Person person=new Person("Test"); 因此加載Person類;執(zhí)行Person類的代碼塊,輸出"person static";執(zhí)行Person類的構(gòu)造函數(shù),輸出"person Test";執(zhí)行父類Test的構(gòu)造函數(shù),輸出"test constructor";初始化自己(MyClass)的成員變量,輸出"person MyClass";執(zhí)行自己的構(gòu)造函數(shù),輸出"myclass constructor";
因此,輸出順序: ?"test static'" ,"myclass static" , "person static ", " person Test" , " test constructor", "person MyClass ", "myclass constructor";