Java基礎篇(一):接口與抽象類


抽象類##

抽象類是用來描述抽象行為的贬芥,比如Animal笑诅,我們不知道Animal具體有會有什么樣的行為调缨,只有具體的動物類,如Dog吆你,Cat才有具體的行為弦叶,才能夠被實例化。抽象類是實現(xiàn)多態(tài)的一種機制早处,它可以包含具體方法(有具體實現(xiàn)的方法)湾蔓,也可以包含抽象方法,而繼承它的子類必須實現(xiàn)這些方法砌梆,下面總結了一下抽象類的特性:

  1. 抽象類不能被實例化默责,但可以有構造函數(shù)
  2. 抽象方法必須由子類進行重寫
  3. 只要包含一個抽象方法的類贬循,就必須定義為抽象類,不管是否還包含其他方法
  4. 抽象類中可以包含具體的方法桃序,也可以不包含抽象方法
  5. 抽象類可以包含普通成員變量杖虾,其訪問類型可以任意
  6. 抽象類也可以包含靜態(tài)成員變量,其訪問類型可以任意
  7. 子類中的抽象方法不能與父類的抽象方法同名
  8. abstract不能與private媒熊、static奇适、final或native并列修飾同一個方法

下面通過一個實例類來說明抽象類的使用

// 抽象類Animal,包含了一個抽象方法cry
abstract class Animal
{
    public abstract void cry(); 
}

// 子類Dog繼承的抽象類Animal芦鳍,必須實現(xiàn)其抽象方法cry
class Dog extends Animal
{
    public void cry()
    {
        System.out.println("Dog cry");
    }
}
// 同樣嚷往,子類Cat繼承的抽象類Animal,必須實現(xiàn)其抽象方法cry
class Cat extends Animal
{
    public void cry()
    {
        System.out.println("Cat cry");
    }
}

public class Test 
{
    public static void main(String[] args) {
        Animal a1 = new Dog();  // 抽象類引用指向子類實例
        Animal a2 = new Cat();
        
        a1.cry();
        a2.cry();
    }
}

輸出結果如下:

Dog cry
Cat cry

由輸出結果可以知道柠衅,使用a1,a2調用cry方法調用的是子類的cry方法皮仁,這是動態(tài)綁定,是實現(xiàn)多態(tài)的一種機制菲宴。

接口##

接口在Java當中是通過關鍵字interface來實現(xiàn)贷祈,接口不是類,所以也不能被實例化喝峦,接口是用來建立類與類之間的協(xié)議势誊,它的提供的只是一種形式,而沒有具體的實現(xiàn)谣蠢。實現(xiàn)類實現(xiàn)(implements)接口粟耻,必須實現(xiàn)接口的全部方法
接口是抽象類的延伸,Java不允許多重繼承(即不能有多個父類漩怎,只能有一個)勋颖,但可以實現(xiàn)多個接口。在使用接口的過程中勋锤,就注意以下幾個問題:

  1. 接口中不能有構造方法饭玲。
  2. 接口的所有方法自動被聲明為public,而且只能為public叁执,如果使用protected茄厘、private,會導致編譯錯誤谈宛。
  3. 接口可以定義"成員變量"次哈,而且會自動轉為public final static,即常量吆录,而且必須被顯式初始化窑滞。
  4. 接口中的所有方法都是抽象方法,不能包含實現(xiàn)的方法,也不能包含靜態(tài)方法
  5. 實現(xiàn)接口的非抽象類必須實現(xiàn)接口的所有方法哀卫,而抽象類不需要
  6. 不能使用new來實現(xiàn)化接口巨坊,但可以聲明一個接口變量,它必須引用一個實現(xiàn)該接口的類的對象此改,可以使用instanceOf來判斷一個類是否實現(xiàn)了某個接口趾撵,如if (object instanceOf ClassName){doSth()};
  7. 在實現(xiàn)多接口的時候一定要注意方法名的重復

抽象類與接口的區(qū)別##

語法層次###

抽象類的定義,如下所示:

// 抽象類中可以包含抽象方法與非抽象方法(必須給出實現(xiàn))
public abstract class Demo 
{
    abstract void foo1();
    void foo2(){
        //實現(xiàn)
    }
}

接口的定義共啃,如下所示:

interface Demo
{
    // 接口中的方法自動轉為public abstract
    void foo1();
    void foo2();
}

抽象類方式中占调,抽象類可以擁有任意范圍的成員數(shù)據(jù),同時也可以擁有自己的非抽象方法移剪,但是接口方式中究珊,它僅能夠有靜態(tài)、不能修改的成員數(shù)據(jù)(即final static挂滓,但是我們一般是不會在接口中使用成員數(shù)據(jù))苦银,同時它所有的方法都必須是抽象的。在某種程度上來說赶站,接口是抽象類的特殊化。

設計層次###

從設計的層面來看纺念,我覺得抽象類與接口有如下幾個不同點:

  1. 抽象層次不同贝椿。可以這樣理解陷谱,抽象類是對類的抽象烙博,接口是對行為的抽象。抽象類對是類整體進行抽象烟逊,包括屬性渣窜、行為,而接口是對類局部(行為)進行抽象宪躯。
  2. 跨域不同乔宿。抽象類所跨域的是具有相似特點的類,而接口可以跨域不同的類访雪。抽象類所體現(xiàn)的是一種繼承關系详瑞,要想使得繼承關系合理,父類和派生類之間必須存在"is-a" 關系臣缀,即父類和派生類在概念本質上應該是相同的坝橡。對于接口則不然,并不要求接口的實現(xiàn)者和接口定義在概念本質上是一致的精置, 僅僅是實現(xiàn)了接口定義的契約而已计寇。

總結##

  1. 抽象類在java語言中所表示的是一種繼承關系,一個子類只能存在一個父類也颤,但是可以存在多個接口颅和。
  2. 在抽象類中可以擁有自己的成員變量和非抽象類方法,但是接口中只能存在靜態(tài)的不可變的成員數(shù)據(jù)(不過一般都不在接口中定義成員數(shù)據(jù))或详,而且它的所有方法都是抽象的贝淤。
  3. 抽象類和接口所反映的設計理念是不同的柒竞,抽象類所代表的是"is-a"的關系,而接口所代表的是"like-a"的關系播聪。抽象類和接口是java語言中兩種不同的抽象概念朽基,他們的存在對多態(tài)提供了非常好的支持,雖然他們之間存在很大的相似性离陶。但是對于他們的選擇往往反應了您對問題域的理解稼虎。只有對問題域的本質有良好的理解,才能做出正確招刨、合理的設計霎俩。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沉眶,隨后出現(xiàn)的幾起案子打却,更是在濱河造成了極大的恐慌,老刑警劉巖谎倔,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳击,死亡現(xiàn)場離奇詭異,居然都是意外死亡片习,警方通過查閱死者的電腦和手機捌肴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藕咏,“玉大人状知,你說我怎么就攤上這事∧醪椋” “怎么了饥悴?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卦碾。 經常有香客問我铺坞,道長,這世上最難降的妖魔是什么洲胖? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任济榨,我火速辦了婚禮,結果婚禮上绿映,老公的妹妹穿的比我還像新娘擒滑。我一直安慰自己腐晾,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布丐一。 她就那樣靜靜地躺著藻糖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪库车。 梳的紋絲不亂的頭發(fā)上巨柒,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音柠衍,去河邊找鬼洋满。 笑死,一個胖子當著我的面吹牛珍坊,可吹牛的內容都是我干的牺勾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阵漏,長吁一口氣:“原來是場噩夢啊……” “哼驻民!你這毒婦竟也來了?” 一聲冷哼從身側響起履怯,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤回还,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叹洲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懦趋,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年疹味,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帜篇。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡糙捺,死狀恐怖,靈堂內的尸體忽然破棺而出笙隙,到底是詐尸還是另有隱情洪灯,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布竟痰,位于F島的核電站签钩,受9級特大地震影響,放射性物質發(fā)生泄漏坏快。R本人自食惡果不足惜铅檩,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莽鸿。 院中可真熱鬧昧旨,春花似錦拾给、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乒疏,卻和暖如春额衙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怕吴。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工窍侧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人械哟。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓疏之,卻偏偏與公主長得像,于是被迫代替她去往敵國和親暇咆。 傳聞我的和親對象是個殘疾皇子锋爪,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 一其骄、抽象類 1、抽象類含義的概括: 當多個類出現(xiàn)相同功能時扯旷,但功能主體不同拯爽,這樣可以向上抽取,抽取時只抽取功能定義...
    玉圣閱讀 830評論 0 6
  • 1. Java基礎部分 基礎部分的順序:基本語法钧忽,類相關的語法毯炮,內部類的語法,繼承相關的語法耸黑,異常的語法桃煎,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 你很清楚的知道什么時候用抽象類,什么時候用接口么大刊?p.s. 多文字預警为迈! 1 抽象類和接口簡介 1.1 抽象類 ...
    Sharember閱讀 2,351評論 9 55
  • 一:java概述:1,JDK:Java Development Kit缺菌,java的開發(fā)和運行環(huán)境葫辐,java的開發(fā)工...
    ZaneInTheSun閱讀 2,649評論 0 11
  • 本文出自 Eddy Wiki ,轉載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,201評論 0 5