static 表示靜態(tài),它可以修飾屬性,方法和代碼塊。
1.static修飾屬性(類變量),那么這個(gè)屬性就可以用類名.屬性名來(lái)訪問(wèn),也就是使這個(gè)屬性成為本類的類變量,為本類對(duì)象所共有。這個(gè)屬性就是全類公有。(共有的類變量與對(duì)象無(wú)關(guān),只和類有關(guān))。
類加載的過(guò)程,類本身也是保存在文件中(字節(jié)碼文件保存著類的信息)的,java會(huì)通過(guò)I/O流把類的文件(字節(jié)碼文件)讀入JVM(java虛擬機(jī)),這個(gè)過(guò)程成為類的加載。JVM(java虛擬機(jī))會(huì)通過(guò)類路徑(CLASSPATH)來(lái)找字節(jié)碼文件。
類變量,會(huì)在加載時(shí)自動(dòng)初始化,初始化規(guī)則和實(shí)例變量相同。
注意:類中的實(shí)例變量是在創(chuàng)建對(duì)象時(shí)被初始化的,被static修飾的屬性,也就是類變量,是在類加載時(shí)被創(chuàng)建并進(jìn)行初始化,類加載的過(guò)程是進(jìn)行一次。也就是類變量只會(huì)被創(chuàng)建一次。
2.static修飾方法(靜態(tài)方法),會(huì)使這個(gè)方法成為整個(gè)類所公有的方法,可以用類名.方法名訪問(wèn)。
注意:static修飾的方法,不直接能訪問(wèn)本類中的非靜態(tài)(static)成員(包括方法和屬性),本類的非靜態(tài)(static)方法可以訪問(wèn)本類的靜態(tài)成員(包括方法和屬性),可以調(diào)用靜態(tài)方法。靜態(tài)方法要慎重使用。在靜態(tài)方法中不能出現(xiàn)this關(guān)鍵字。
注意:父類中是靜態(tài)方法,子類中不能覆蓋為非靜態(tài)方法,在符合覆蓋規(guī)則的前提下,在父子類中,父類中的靜態(tài)方法可以被子類中的靜態(tài)方法覆蓋,但是沒有多態(tài)。(在使用對(duì)象調(diào)用靜態(tài)方法是其實(shí)是調(diào)用編譯時(shí)類型的靜態(tài)方法)
注意:父子類中,靜態(tài)方法只能被靜態(tài)方法覆蓋,父子類中,非靜態(tài)方法只能被非靜態(tài)方法覆蓋。
java中的main方法必須寫成static的因?yàn)椋陬惣虞d時(shí)無(wú)法創(chuàng)建對(duì)象,因?yàn)殪o態(tài)方法可以不通過(guò)對(duì)象調(diào)用所以在類的main方法。所在在類加載時(shí)就可以通過(guò)main方法入口來(lái)運(yùn)行程序。
3.static修飾初始代碼塊,這時(shí)這個(gè)初始代碼塊就叫做靜態(tài)初始代碼塊,這個(gè)代碼塊只在類加載時(shí)被執(zhí)行一次。可以用靜態(tài)初始代碼塊初始化一個(gè)類。
動(dòng)態(tài)初始代碼塊,寫在類體中的“{}”,這個(gè)代碼塊是在生成對(duì)象的初始化屬性是運(yùn)行。這種代碼塊叫動(dòng)態(tài)初始代碼塊。
類在什么時(shí)候會(huì)被加載,創(chuàng)建對(duì)象時(shí)會(huì)加載類,調(diào)用類中靜態(tài)方法或訪問(wèn)靜態(tài)屬性也是會(huì)加載類的。在加載子類時(shí)必會(huì)先加載父類,類加載會(huì)有延遲加載原則,只有在必須加載時(shí)才會(huì)加載。
final修飾符,可以修飾變量,方法,類
1.final修飾變量
被fianl修飾的變量就會(huì)變成常量(常量應(yīng)當(dāng)大寫),一旦賦值不能改變,(可以在初始化時(shí)直接賦值,也可以在構(gòu)造方法里也可以賦值,只能在這兩種方法里二選一,不能不為常量賦值),fianl的常量不會(huì)有默認(rèn)初始值,對(duì)于直接在初始化是賦值時(shí)final修飾符常和static修飾符一起使用。
2.final修飾方法,被final修飾的方法將不能被其子類覆蓋,保持方法的穩(wěn)定不能被覆蓋。
3.final修飾類,被final修飾的類將不能被繼承。final類中的方法也都是final的。
注意:final,不能用來(lái)修飾構(gòu)造方法,在父類中如果有常量屬性,在子類中使用常量屬性時(shí)是不會(huì)進(jìn)行父類的類加載。
不變模式,對(duì)象一旦創(chuàng)建屬性就不會(huì)改變。用final修飾屬性,也用final修飾類(強(qiáng)不變模式),用final修飾屬性(弱不變模式)。
不變模式的典型體現(xiàn):java.lang.String類,不變模式可以實(shí)現(xiàn)對(duì)象的共享(可以用一個(gè)對(duì)象實(shí)例賦值給多個(gè)對(duì)象變量)
池化的思想,把需要共享的數(shù)據(jù)放在池中(節(jié)省空間,共享數(shù)據(jù))
只有String類可以用“”中的字面值創(chuàng)建對(duì)象。在String類中,以字面值創(chuàng)建時(shí),會(huì)到Java方法空間的串池空間中去查找,如果有就返回串池中字符串的地址,并把這個(gè)地址付給對(duì)象變量。如果沒有則會(huì)在串池里創(chuàng)建一個(gè)字符串對(duì)象,并返回其地址付購(gòu)對(duì)象變量,當(dāng)另一個(gè)以字面值創(chuàng)建對(duì)象時(shí)則會(huì)重復(fù)上述過(guò)程。
如果是new在堆空間中創(chuàng)建String類的對(duì)象,則不會(huì)有上述的過(guò)程。
String類中的intern()方法會(huì)將在堆空間中創(chuàng)建的String類對(duì)象中的字符串和串池中的比對(duì),如果有相同的串就返回這個(gè)串的串池中的地址。
不變模式在對(duì)于對(duì)象進(jìn)行修改,添加操作是使相當(dāng)麻煩的,他會(huì)產(chǎn)生很多的中間垃圾對(duì)象。創(chuàng)建和銷毀的資源的開銷是相當(dāng)大的。
String類在字符串連接時(shí)會(huì)先的效率很低,就是因?yàn)樗a(chǎn)生的對(duì)象的書性是不能夠修改的,當(dāng)連接字符串時(shí)也就是只能創(chuàng)建新的對(duì)象。
對(duì)于很多的字符串連接,應(yīng)當(dāng)使用StringBuffer類,在使用這個(gè)類的對(duì)象來(lái)進(jìn)行字符串連接時(shí)就不會(huì)有多余的中間對(duì)象生成,從而優(yōu)化了效率。
abstract(抽象)修飾符,可以修飾類和方法
1.abstract修飾類,會(huì)使這個(gè)類成為一個(gè)抽象類,這個(gè)類將不能生成對(duì)象實(shí)例,但可以做為對(duì)象變量聲明的類型,也就是編譯時(shí)類型,抽象類就像當(dāng)于一類的半成品,需要子類繼承并覆蓋其中的抽象方法。
2.abstract修飾方法,會(huì)使這個(gè)方法變成抽象方法,也就是只有聲明(定義)而沒有實(shí)現(xiàn),實(shí)現(xiàn)部分以";"代替。需要子類繼承實(shí)現(xiàn)(覆蓋)。
注意:有抽象方法的類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以全是具體方法。
abstract修飾符在修飾類時(shí)必須放在類名前。
abstract修飾方法就是要求其子類覆蓋(實(shí)現(xiàn))這個(gè)方法。調(diào)用時(shí)可以以多態(tài)方式調(diào)用子類覆蓋(實(shí)現(xiàn))后的方法,也就是說(shuō)抽象方法必須在其子類中實(shí)現(xiàn),除非子類本身也是抽象類。
注意:父類是抽象類,其中有抽象方法,那么子類繼承父類,并把父類中的所有抽象方法都實(shí)現(xiàn)(覆蓋)了,子類才有創(chuàng)建對(duì)象的實(shí)例的能力,否則子類也必須是抽象類。抽象類中可以有構(gòu)造方法,是子類在構(gòu)造子類對(duì)象時(shí)需要調(diào)用的父類(抽象類)的構(gòu)造方法。
final和abstract,private和abstract,static和abstract,這些是不能放在一起的修飾符,因?yàn)閍bstract修飾的方法是必須在其子類中實(shí)現(xiàn)(覆蓋),才能以多態(tài)方式調(diào)用,以上修飾符在修飾方法時(shí)期子類都覆蓋不了這個(gè)方法,final是不可以覆蓋,private是不能夠繼承到子類,所以也就不能覆蓋,static是可以覆蓋的,但是在調(diào)用時(shí)會(huì)調(diào)用編譯時(shí)類型的方法,因?yàn)檎{(diào)用的是父類的方法,而父類的方法又是抽象的方法,又不能夠調(diào)用,所以上的修飾符不能放在一起。
抽象(abstract)方法代表了某種標(biāo)準(zhǔn),定義標(biāo)準(zhǔn),定義功能,在子類中去實(shí)現(xiàn)功能(子類繼承了父類并需要給出從父類繼承的抽象方法的實(shí)現(xiàn))。
方法一時(shí)間想不到怎么被實(shí)現(xiàn),或有意要子類去實(shí)現(xiàn)而定義某種標(biāo)準(zhǔn),這個(gè)方法可以被定義為抽象。(abstract)
模板方法模式
用abstract把制訂標(biāo)準(zhǔn)和實(shí)現(xiàn)標(biāo)準(zhǔn)分開,制定的標(biāo)準(zhǔn)就是模板,實(shí)現(xiàn)就是按模板標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn),也就是繼承模板,實(shí)現(xiàn)模板中相應(yīng)功能的方法。模板中不允許修改的方法可以用fianl來(lái)修飾,這個(gè)方法不能使抽象方法,為保證安全,封裝,把模板中不公開的部分用protected(保護(hù))修飾。