為什么要在定義抽象類時(shí)使用abstract關(guān)鍵字
眾所周之,在任何面向?qū)ο蟮恼Z(yǔ)言中(包括Java、C#),在定義抽象類時(shí)必須使用abstract關(guān)鍵字。雖然這已經(jīng)習(xí)已為常了,但實(shí)際上abstract是為了在實(shí)現(xiàn)接口或繼承抽象類避免歧議而必須存在的。
看如下代碼:
{
abstract void method();
}
上面的代碼是一個(gè)典型的抽象類,在定義類時(shí)和定義方法時(shí)都使用了abstract。但從編譯器的角度來(lái)說(shuō),在定義類時(shí)完全可以不使用abstract,如下面的代碼所示:
{
abstract void method();
}
對(duì)于上面的代碼,編譯器在編譯時(shí)并不會(huì)產(chǎn)生奇異,只要檢測(cè)到類中有一個(gè)用abstract關(guān)鍵字的代碼,就可以在編譯的過程中自動(dòng)向Class1添加abstract,也就是說(shuō),在定義Class1時(shí)添加abstract的工作應(yīng)該由編譯器來(lái)完成。
雖然上面的過程看起來(lái)沒什么問題,也并不難實(shí)現(xiàn),但各位不要忘了,實(shí)現(xiàn)抽象類除了上面的方式,還有另外一種方式,這就是實(shí)現(xiàn)接口,而并不實(shí)現(xiàn)接口中的所有方法。看下面的代碼:
{
public void method1();
public void method2();
}
abstract class MyClass implements MyInterface
{
public void method1()
{


}
}
上面代碼中MyClass類并未實(shí)現(xiàn)method2方法,也并示在定義方法時(shí)使用abstract關(guān)鍵字,然后,method2方法實(shí)際上就是abstract方法。
大家可以想象,如果在定義抽象類時(shí)不使用abstract關(guān)鍵字會(huì)怎么樣呢?看下面的代碼:
{
public void method1();
public void method2();
}
class MyClass implements MyInterface
{
public void method1()
{


}
}
上面的代碼一定會(huì)編譯出錯(cuò)的,因?yàn)榫幾g器蒙了。在面向?qū)ο笳Z(yǔ)言中規(guī)定,一個(gè)普通類必須實(shí)現(xiàn)接口中的所有方法。而在上面的代碼中,method2方法未實(shí)現(xiàn)。而編譯器無(wú)法判斷MyClass類是抽象類,還是普通類。如果按著普通類來(lái)處理,則會(huì)編譯出錯(cuò),如果按著抽象類來(lái)處理,則完全符合面向?qū)ο笠?guī)則。因此,就產(chǎn)生了歧議。當(dāng)編譯器在編譯源代碼時(shí),一定會(huì)產(chǎn)生錯(cuò)誤,否則可能會(huì)編譯成和源代碼的含義不同的二進(jìn)制目標(biāo)文件。
當(dāng)然,上面的代碼也可以設(shè)置默認(rèn)的規(guī)則,也就是按著普通類處理不通過時(shí),就按著抽象類來(lái)處理。但這又會(huì)帶來(lái)另一個(gè)問題。如果開發(fā)人員忘記實(shí)現(xiàn)某個(gè)接口的方法,那不是這個(gè)類就會(huì)被編譯器認(rèn)為是抽象類了嗎?因此,為了保險(xiǎn)起見,編譯器的設(shè)計(jì)者特意為抽象類指定一個(gè)abstract關(guān)鍵字,也就是說(shuō),這個(gè)類是否是抽象類,應(yīng)由開發(fā)人員通過編碼的方式來(lái)指定,而不是由編譯器自做主張。
從上面的描述可以看出,加abstract關(guān)鍵字主要是為了避免普通類在實(shí)現(xiàn)接口時(shí)產(chǎn)生的歧議。如果假設(shè)面向?qū)ο笳Z(yǔ)言中沒有接口,abstract關(guān)鍵字完全可以去掉。當(dāng)然,繼承抽象類也和實(shí)現(xiàn)接口類似。
象面向?qū)ο笳Z(yǔ)言中的靜態(tài)方法很多就沒有靜態(tài)類的概念(Java沒有,C#有)。因此,在定義類時(shí)加不加static,并不會(huì)產(chǎn)生奇異,所以static關(guān)鍵字在定義靜態(tài)類時(shí)也就不是必須的了。
《Android開發(fā)完全講義(第2版)》(本書版權(quán)已輸出到臺(tái)灣)
http://product.dangdang.com/product.aspx?product_id=22741502
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
posted on 2008-09-30 14:31 銀河使者 閱讀(1592) 評(píng)論(4) 編輯 收藏 所屬分類: java 、 原創(chuàng)