(一)概述
我從工作開(kāi)始之前開(kāi)始寫(xiě)博客嚎朽,寫(xiě)到現(xiàn)在發(fā)現(xiàn)以前寫(xiě)的內(nèi)容在現(xiàn)在看來(lái)有了更多想法,因此有了現(xiàn)在的知識(shí)重寫(xiě)計(jì)劃柬帕,最主要的目的是維護(hù)github上的知識(shí)體系哟忍,讓JavaStarter更加成熟。
在Java中陷寝,有許多關(guān)鍵字锅很,比如final、static凤跑、this爆安、super、public仔引、private扔仓、protected等,我之前也寫(xiě)了幾篇文章介紹其中的幾個(gè)關(guān)鍵字咖耘,今天干脆一次性把這些關(guān)鍵字都重新整理一遍翘簇,也是對(duì)之前內(nèi)容的一個(gè)補(bǔ)充。
(二)final
final作為Java中的關(guān)鍵字可以用于三個(gè)地方儿倒。用于修飾類(lèi)版保、類(lèi)屬性和類(lèi)方法。
特征:凡是引用final關(guān)鍵字的地方皆不可修改夫否!
(1)修飾類(lèi):表示該類(lèi)不能被繼承彻犁;
(2)修飾方法:表示方法不能被重寫(xiě);
(3)修飾變量:表示變量不能被修改凰慈。
修飾變量
final修飾變量后這個(gè)變量不能被修改汞幢,這個(gè)不能被修改的說(shuō)法對(duì)于不同的數(shù)據(jù)類(lèi)型有不同的含義。
首先對(duì)于8個(gè)基本數(shù)據(jù)類(lèi)型微谓,當(dāng)使用final修飾時(shí)森篷,初始化后這個(gè)值是不會(huì)變的。
如果使用final修飾引用類(lèi)型數(shù)據(jù)時(shí)堰酿,表示該引用初始化后永遠(yuǎn)指向一個(gè)地址疾宏,而這個(gè)地址里的對(duì)象是可以修改的张足。
final User user=new User("javayz",23);
user.setAge(18);
在上面一段代碼中触创,用final修飾了自定義的User對(duì)象,但user對(duì)象依舊可以被修改为牍。
修飾方法
final修飾方法的作用是讓方法無(wú)法被重寫(xiě)哼绑,這里沒(méi)有太多額外的內(nèi)容
修飾類(lèi)
當(dāng)使用final修飾類(lèi)的時(shí)候表明這個(gè)類(lèi)不能被繼承岩馍,被修飾的類(lèi)所有成員方法都會(huì)被隱式地修飾為final方法。
(三)static
通常來(lái)說(shuō)抖韩,我們通過(guò)new創(chuàng)建一個(gè)對(duì)象時(shí)蛀恩,這個(gè)對(duì)象的存儲(chǔ)空間才會(huì)被分配,這個(gè)時(shí)候?qū)ο罄锏姆椒ú拍鼙徽{(diào)用茂浮。但是有的時(shí)候會(huì)有這樣一種需求双谆,希望在沒(méi)有創(chuàng)建對(duì)象的時(shí)候,也能訪問(wèn)這個(gè)類(lèi)里的方法或者變量席揽,這種情況下就可以使用static關(guān)鍵字顽馋。
static關(guān)鍵字修飾的方法一般會(huì)被稱為類(lèi)方法或者靜態(tài)方法,static關(guān)鍵字修飾的變量一般會(huì)被稱為類(lèi)變量或者靜態(tài)變量幌羞。被static修飾的類(lèi)和方法屬于這個(gè)類(lèi)寸谜,而不屬于由這個(gè)類(lèi)生成的某個(gè)對(duì)象,可以通過(guò)類(lèi)名.靜態(tài)變量和類(lèi)名.靜態(tài)方法名訪問(wèn)這些成員属桦。
比如在寫(xiě)工具類(lèi)的時(shí)候熊痴,我們一般會(huì)把工具類(lèi)中發(fā)方法定義成static,而不需要每次調(diào)用工具類(lèi)時(shí)都去創(chuàng)建一個(gè)對(duì)象:
被static修飾的代碼塊稱為靜態(tài)代碼塊聂宾,靜態(tài)代碼塊只會(huì)執(zhí)行一次果善。
接下來(lái)通過(guò)一道經(jīng)典執(zhí)行順序的面試題加深對(duì)static的理解,說(shuō)出這段代碼的結(jié)果:
public class Father {
private int i=test();
private static int j=method();
static {
System.out.print("1 ");
}
Father(){
System.out.print("2 ");
}
{
System.out.print("3 ");
}
public int test() {
System.out.print("4 ");
return 1;
}
public static int method(){
System.out.print("5 ");
return 1;
}
}
public class Son extends Father{
private int i=test();
private static int j=method();
static {
System.out.print("6 ");
}
Son(){
System.out.print("7 ");
}
{
System.out.print("8 ");
}
public int test() {
System.out.print("9 ");
return 1;
}
public static int method(){
System.out.print("10 ");
return 1;
}
public static void main(String[] args) {
Son s1=new Son();
System.out.println();
Son s2=new Son();
}
}
最后的結(jié)果為:
類(lèi)初始化過(guò)程:
一個(gè)子類(lèi)要初始化需要先初始化父類(lèi)系谐;執(zhí)行靜態(tài)類(lèi)變量和靜態(tài)代碼塊從上到下執(zhí)行岭埠。
所以第一遍創(chuàng)建Son對(duì)象實(shí)例的時(shí)候會(huì)先執(zhí)行父類(lèi)靜態(tài)類(lèi)變量和靜態(tài)代碼塊,再執(zhí)行子類(lèi)蔚鸥。所以是5 1 10 6
實(shí)例初始化
先調(diào)用Super惜论;再調(diào)用非靜態(tài)實(shí)例變量和非靜態(tài)代碼塊從上到下執(zhí)行;再調(diào)用無(wú)參構(gòu)造方法止喷;調(diào)用Super時(shí)注意父類(lèi)的對(duì)象是否被子類(lèi)重寫(xiě)馆类,如果重寫(xiě)就按照子類(lèi)的重寫(xiě)來(lái)計(jì)算。
所以先調(diào)用父類(lèi)的test方法弹谁,因?yàn)楸蛔宇?lèi)重寫(xiě)乾巧,輸出9,再調(diào)用非靜態(tài)代碼预愤,輸出3沟于,調(diào)用無(wú)參構(gòu)造,輸出2植康,同理子類(lèi)輸出987旷太。
(三)this
this關(guān)鍵表示指向當(dāng)前對(duì)象本身的對(duì)象,在一個(gè)對(duì)象內(nèi)部,我們可以通過(guò)this.xxx去訪問(wèn)該對(duì)象的屬性或者方法供璧。在我們剛開(kāi)始學(xué)Java的時(shí)候存崖,寫(xiě)的第一個(gè)類(lèi)的set方法就會(huì)用到this關(guān)鍵字:
public class User {
private String name;
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
}
表示當(dāng)前這個(gè)對(duì)象的name變量等于setName方法傳入的name參數(shù)。
(四)super
super關(guān)鍵字可以理解為指向自己父類(lèi)對(duì)象的指針睡毒,可以從子類(lèi)訪問(wèn)父類(lèi)的屬性和方法来惧,比如:
public class User {
private String name;
private String address;
public void doSomething(){
System.out.println("User do something");
}
}
public class UserDetail extends User {
void superInfo(){
super.doSomething();
}
}
由于this和super都是調(diào)用對(duì)象實(shí)例中的屬性和方法,因此this和super都不能用在static方法中演顾。
(五)訪問(wèn)修飾符
Java中通過(guò)訪問(wèn)修飾符來(lái)控制類(lèi)中每個(gè)成員和方法的訪問(wèn)權(quán)限供搀,public、protected钠至、private趁曼,如果不寫(xiě)訪問(wèn)權(quán)限修飾符,則表示它是包訪問(wèn)權(quán)限棕洋,有些地方也會(huì)稱為friendly挡闰。
public:對(duì)所有類(lèi)可見(jiàn),類(lèi)掰盘、接口摄悯、變量、方法都可以使用愧捕。
protected:對(duì)同一包內(nèi)的類(lèi)和所有子類(lèi)可見(jiàn)奢驯,變量、方法可以使用次绘。
包訪問(wèn)權(quán)限(什么也不寫(xiě)):同一包內(nèi)可見(jiàn)瘪阁,類(lèi)、接口邮偎、變量管跺、方法都可以使用。
private:在同一類(lèi)內(nèi)可見(jiàn)禾进,變量豁跑、方法可以使用。
(六) 總結(jié)
今天的幾個(gè)知識(shí)點(diǎn)都是基礎(chǔ)中的基礎(chǔ)泻云,很簡(jiǎn)單艇拍,但是你如果不會(huì),面試基本上必掛宠纯。好了卸夕,知識(shí)重寫(xiě)計(jì)劃第一篇結(jié)束了,我會(huì)同步更新到github上婆瓜,逐漸讓JavaStarter更加完善快集。我是Java魚(yú)仔,我們下期再見(jiàn)。