Java學習(下)

三、繼承

繼承:

繼承是類與類的一種關系,是一種“is a”的關系。比如說椭住,狗是一種動物(dog is an animal),汽車是一種交通工具(car is a vehicle)字逗,在這里動物和交通工具就稱為父類(基類)京郑,狗和汽車就稱為子類(派生類)。就像日常生活中我們所說的繼承一樣葫掉,兒子會繼承父親的一些相貌上或者性格上的特點些举,還會耳濡目染、有樣學樣地繼承父親的一些行為方式俭厚;而在Java中户魏,子類則會繼承父類所有的屬性和方法(當然private修飾的屬性和方法不可以繼承哦)。
繼承的關鍵字為extends具體定義語法為:

 [權(quán)限修飾符] class 類名 extends 父父類名{
    //定義或修改屬性
    //定義或重寫方法
}

注意:類是單繼承的挪挤,即每個類只能有一個父類叼丑。

方法的重寫與方法的重載:

上面說過子類可以繼承父類的方法,但如果父類中的方法不夠完善或者不能滿足子類的要求扛门,這時候子類就可以修改父類的方法鸠信,拓展功能或者重新定義,這就是方法的重寫论寨。
在同一個類中星立,我們可以定義一些名稱相同的方法爽茴,但這些方法的參數(shù)或者返回值類型卻不同。在調(diào)用方法時贞铣,雖然這些方法都是同名的闹啦,但Java會根據(jù)不同的參數(shù)列表來選擇正確的方法進行調(diào)用,這就是方法的重載辕坝。
方法的重寫和重載從字面上來看只有一字之差,但是本質(zhì)上卻有很大的區(qū)別荐健,以下是需要注意的幾點:

  • 子類中重寫的方法與父類中的方法有完全相同返回值類型酱畅、方法名參數(shù)個數(shù)以及參數(shù)類型江场,只是方法體不同
  • 重載的方法必須具有不同的參數(shù)列表纺酸,即不同的參數(shù)類型或者不同的參數(shù)個數(shù)或者不同的參數(shù)順序,因此方法體也就不同了址否。除此之外餐蔬,權(quán)限修飾符和返回值類型也可以不同,但方法名必須要相同
  • 方法的重寫和重載都可以改變權(quán)限修飾符佑附,但都只能將范圍擴大(關于權(quán)限修飾符的作用范圍上文有介紹)
  • 一般來說樊诺,重載方法時,方法之間需要存在一定的聯(lián)系音同,例如功能相似词爬,因為這樣才能使方法的重載有意義,并且提高程序的可讀性
super關鍵字:

如果子類已經(jīng)將父類中的方法重寫了权均,調(diào)用的時候肯定是調(diào)用被重寫過的方法顿膨,那如果現(xiàn)在一定要調(diào)用父類中的方法,此時就可以通過使用super關鍵字:super.方法名(參數(shù)列表)來實現(xiàn)

下面以狗類(子類)和動物類(父類)為例具體演示一下上面介紹的幾個概念叽赊,先定義Dog類和Animal類:

package com.project;
public class Animal{//定義Animal類
    int legs = 2;//定義legs屬性
    public void eat(){//定義eat方法 
        System.out.println("動物具有吃東西的能力");
}  


package com.project;
public class Dog extends Animal{//定義Dog類
}

修改項目測試類的代碼:

    public class Test {
    public static void main(String[] args) {
        Dog obj = new Dog();//創(chuàng)建Dog類對象obj
        System.out.println(obj.legs);//輸出obj的legs屬性值
        obj.eat();//調(diào)用obj的eat()方法
    }
}

控制臺界面會輸出以下信息:

控制臺顯示

說明子類可以繼承父類的屬性和方法恋沃。

修改Dog類的代碼:

  public class Dog extends Animal{
    int legs = 4;
    public void eat(){//重寫eat()方法 
        super.eat();//用super關鍵字調(diào)用Animal類中的eat()方法
        System.out.println("狗具有吃骨頭的能力");
      }
  }

其他代碼不作改動,控制臺界面會輸出以下信息:

控制臺顯示

說明子類可以修改父類的屬性和重寫父類的方法必指。

四囊咏、多態(tài)

多態(tài):

多態(tài),從字面上理解就是多種形態(tài)取劫,Java中指的是對象的多種形態(tài)匆笤。

多態(tài)分為兩種:

  • 引用多態(tài):父類的引用既可以指向本類的對象,也可以引用子類的對象
  • 方法多態(tài):當通過父類創(chuàng)建本類對象時谱邪,調(diào)用的方法為本類的方法炮捧;創(chuàng)建子類對象時,調(diào)用的方法為子類繼承的方法或重寫的方法(即不能調(diào)用子類獨有的方法)

還是以Dog類和Animal類為例惦银,修改Dog類和項目測試類主方法的代碼:

public class Dog extends Animal{
    public void eat(){
        System.out.println("狗具有吃骨頭的能力");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal obj1 = new Animal();//通過Animal類創(chuàng)建Animal類對象obj1
        Animal obj2 = new Dog();//通過Animal類創(chuàng)建Dog類對象obj2(通過構(gòu)造方法可以區(qū)別創(chuàng)建的是哪類對象)
        obj1.eat();//調(diào)用obj1的eat()方法
        obj2.eat();//調(diào)用obj2重寫的eat()方法
    }
}

控制臺界面會輸出以下信息:

控制臺顯示

再次修改Dog類和項目測試類主方法的代碼:

public class Dog extends Animal{
    public void eat(){
        System.out.println("狗具有吃骨頭的能力");
    }
    public void watchDoor(){//定義watchDoor方法
        System.out.println("狗具有看門的能力");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal obj1 = new Animal();
        Animal obj2 = new Dog()咆课;
        obj1.eat();
        obj2.eat();
        obj2.watchDoor();//調(diào)用obj2的獨有的watchDoor方法
    }
}

此時末誓,obj2.watchDoor();這個地方程序會報錯:

程序報錯

因為父類中并沒有定義watchDoor()方法,通過父類創(chuàng)建子類對象并調(diào)用這個子類獨有的方法時就會報錯书蚪。

抽象類:

抽象類只是規(guī)定子類必須擁有的方法喇澡,但并不規(guī)定這些方法是如何實現(xiàn)的。因此殊校,可以從多個具有相同特征的類中抽象出一個抽象類晴玖,這個抽象類作為子類的模版,從而避免子類設計的隨意性为流。需要注意的是:

  • 抽象類和抽象方法都是用abstract關鍵字來修飾
  • abstract定義抽象方法時呕屎,只需要聲明即可,不需要定義具體實現(xiàn)(因為抽象類并不關注這些方法是如何實現(xiàn)的)敬察,即abstract 類名();//沒有方法體
  • 抽象類中既可以有普通方法秀睛,也可以有抽象方法
  • 包含抽象方法的類一定是抽象類

下面以狗類(子類)、貓類(子類)和動物類(父類莲祸,同時也是抽象類)為例具體演示一下上面介紹的幾個概念蹂安,先定義Dog類、Cat類和Animal類:

public abstract class Animal{//定義Animal抽象類
    public abstract void eat();//定義eat抽象方法
    public abstract void voice();//定義voice抽象方法 
}  

public class Dog extends Animal{
    public void eat(){//定義eat()方法在Dog類中的具體實現(xiàn)
        System.out.println("狗具有吃骨頭的能力");
    }
    public void voice(){//定義voice()方法在Dog類中的具體實現(xiàn)
        System.out.println("狗“汪汪汪”地叫");
    }
}

public class Cat extends Animal{
    public void eat(){//定義eat()方法在Cat類中的具體實現(xiàn)
        System.out.println("貓具有吃魚的能力");
    }
    public void voice(){//定義voice()方法在Cat類中的具體實現(xiàn)
        System.out.println("貓“喵喵喵”地叫");
    }
}

修改項目測試類的代碼:

 public class Test {
    public static void main(String[] args) {
        Dog obj1 = new Dog();
        Cat obj2 = new Cat();
        obj1.eat();
        obj1.voice();
        obj2.eat();
        obj2.voice();
    }
}

控制臺界面會輸出以下信息:

控制臺顯示
接口:

接口定義的是某一批類所共同遵守的規(guī)范锐帜,既不關心這些類中的數(shù)據(jù)田盈,也不關心這些類中方法的具體實現(xiàn),只規(guī)定這些類中必須包含的方法(這一點與抽象類很相似)抹估。
定義接口的關鍵字為interface缠黍。接口不同于類,它可以繼承多個父接口药蜻。具體的定義語法為:

[權(quán)限修飾符] [abstract] interface 接口名 [extends 父接口1, 父接口2, ...]{
    //定義一個或多個常量
    //定義一個或多個抽象方法
}

注意:

  • 因為接口中包含的是常量和抽象方法瓷式,所以定義接口的時候系統(tǒng)會自動添加abstract關鍵字
  • 接口中的屬性均為靜態(tài)常量,因此在定義屬性的時候系統(tǒng)會自動添加public static final修飾符
  • 接口中的方法均為抽象方法语泽,因此在定義方法的時候系統(tǒng)會自動添加public abstract修飾符
  • 接口是用來被繼承和被實現(xiàn)的贸典,因此不能使用privateprotected修飾(這樣會使得接口沒有意義),一般使用public修飾

使用implements關鍵字實現(xiàn)接口踱卵。而當類既繼承父類又實現(xiàn)接口時廊驼,定義語法為:

[權(quán)限修飾符] class 類名 extends 父類 implements 接口1, 接口2, ...{//一個類可以實現(xiàn)多個接口
    //如果繼承了抽象類,要包含繼承的抽象方法惋砂;此外還要包含接口的抽象方法
}

注意:

  • 在給接口命名的時候通常在名字前面加上一個“I”
  • 繼承父類必須要在實現(xiàn)接口之前

還是以狗類妒挎、貓類為例,現(xiàn)在要他們都繼承哺乳動物類西饵。狗和貓都有吃東西和叫的能力酝掩,但狗能游泳而貓卻不能。在大自然中眷柔,鴨子也是會游泳的期虾,但很明顯原朝,鴨子并不屬于哺乳動物,即不能繼承哺乳動物類镶苞。因此要想描述狗和鴨子都具有游泳的能力喳坠,就要用到接口。

先定義ISwim接口:

package com.project;
public interface ISwim{
    public void swim();
}

定義Mammal類(定義的代碼與Animal類一樣茂蚓,只是類名不同)壕鹉,修改Dog類和Cat類的代碼,:

public class Dog extends Mammal implements ISwim{//實現(xiàn)ISwim接口
    public void eat(){
        System.out.println("狗具有吃骨頭的能力");
    }
    public void voice(){
        System.out.println("狗“汪汪汪”地叫");
    }
    public void swim(){//定義swim()方法在Dog類中的具體實現(xiàn)
        System.out.println("狗具有游泳的能力");
    }
}

public class Cat extends Mammal{
    public void eat(){
        System.out.println("貓具有吃魚的能力");
    }
    public void voice(){
        System.out.println("貓“喵喵喵”地叫");
    }
}

定義Duck類:

public class Duck implements ISwim{//實現(xiàn)ISwim接口
    public void swim(){//定義swim()方法在Duck類中的具體實現(xiàn)
        System.out.println("鴨子具有游泳的能力");
    }
}

修改項目測試類主方法的代碼:

public class Test {
    public static void main(String[] args) {
        Dog obj1 = new Dog();
        Cat obj2 = new Cat();
        Duck obj3 = new Duck();
        obj1.eat();
        obj1.voice();
        obj1.swim();
        obj2.eat();
        obj2.voice();
        obj3.swim();
    }
}

控制臺界面會輸出以下信息:

控制臺顯示

后記

以上的內(nèi)容是我通過看書和看視頻以及上網(wǎng)找資料歸納聋涨、總結(jié)出來的御板,目的在于為我今后復習Java基礎知識和編寫Java程序時提供可查閱的筆記,我也希望能夠給閱讀本文的Java初學者一些幫助牛郑。

參考資料

《Java——從入門到精通》
慕課網(wǎng)(IMOOC)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市敬鬓,隨后出現(xiàn)的幾起案子淹朋,更是在濱河造成了極大的恐慌,老刑警劉巖钉答,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件础芍,死亡現(xiàn)場離奇詭異,居然都是意外死亡数尿,警方通過查閱死者的電腦和手機仑性,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來右蹦,“玉大人诊杆,你說我怎么就攤上這事『温剑” “怎么了晨汹?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贷盲。 經(jīng)常有香客問我淘这,道長,這世上最難降的妖魔是什么巩剖? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任铝穷,我火速辦了婚禮,結(jié)果婚禮上佳魔,老公的妹妹穿的比我還像新娘曙聂。我一直安慰自己,他們只是感情好吃引,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布筹陵。 她就那樣靜靜地躺著刽锤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朦佩。 梳的紋絲不亂的頭發(fā)上并思,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音语稠,去河邊找鬼宋彼。 笑死,一個胖子當著我的面吹牛仙畦,可吹牛的內(nèi)容都是我干的输涕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慨畸,長吁一口氣:“原來是場噩夢啊……” “哼莱坎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寸士,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤檐什,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弱卡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乃正,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年婶博,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓮具。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡凡人,死狀恐怖名党,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兑巾,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布忠荞,位于F島的核電站蒋歌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碧绞。R本人自食惡果不足惜府框,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望系宜。 院中可真熱鬧照激,春花似錦、人聲如沸盹牧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汰寓。三九已至口柳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間有滑,已是汗流浹背跃闹。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毛好,地道東北人辣卒。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像睛榄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子想帅,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文出自 Eddy Wiki 场靴,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,206評論 0 5
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法港准,內(nèi)部類的語法旨剥,繼承相關的語法,異常的語法浅缸,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,529評論 3 93
  • 一:java概述:1轨帜,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境衩椒,java的開發(fā)工...
    ZaneInTheSun閱讀 2,653評論 0 11
  • 感恩昨晚開車回家后有一個好車位蚌父;感恩妹夫帶好吃的給我們;感恩老公中午做的美餐毛萌;感恩孩子們苟弛;感恩昨天爸爸媽媽的招待;...
    深山_132f閱讀 83評論 2 1