【6.23】java的繼承與多態(tài)

java 繼承 多態(tài)


繼承與多態(tài)是面向?qū)ο蟮恼Z言的兩個重要的特點,深入的認識對運用好這門編程語言非常重要。

今天的內(nèi)容包括兩部分,概念整理和代碼分析。
現(xiàn)附上一段今天寫的代碼,因為對這部分不滿意,之后會填坑重寫。

import java.util.ArrayList;

class Man{
    private String name;
    private Boolean sex;
    private long num;
    Man(String name,Boolean sex,long num){
        this.name = name;
        this.sex = sex;
        this.num = num;
    }
    String getstuname(){return name;}
    Boolean getSex(){return sex;};
    long getNum(){return num;};
}

/**
 * 目標是構(gòu)建一個Manlist類,該類是一個數(shù)組類,通過繼承ArrayList使其成為一個動態(tài)數(shù)組,能夠非常便捷的完成增刪查改的功能
 */
class Manlist extends ArrayList{
    protected ArrayList<Man> list;
    Manlist(int n){
        list = new ArrayList<Man>(n);
    }
    Manlist(int n,Man[] list1){
        list = new ArrayList<Man>(n);
        for(int i = 0;i<list1.length;i++)
            list.add(list1[i]);
    }
    void addMember(Man m){
        add(m);
    }
    //對get函數(shù)進行重載,滿足其搜索姓名的要求
    Man get(String name){
        int flag = 0;
        int k = 0;
        for(int i=0;i<list.size();i++){
            Boolean identify = list.get(i).getstuname().equals(name);
            if(identify){
                flag = 1;
                k = i;
                break;
            }
        }
        if(flag == 1)
            return list.get(k);
       else
            return null;
    }
    Man modifyNum(long No){
        int flag = 0;
        int k = 0;
        for(int i=0;i<list.size();i++){
            if(list.get(i).getNum() == No){
                flag = 1;
                k = i;
                break;
            }
        }
        if(flag == 1)
            return list.get(k);
        else
            return null;
    }
    void deleteMember(String name){
        int i;
        for(i = 0;i<list.size();i++){
            String stuname = list.get(i).getstuname();
            if(stuname.equals(name))
                break;
        }
        list.remove(i);
    }
    void addMember(Man m,int n){
        list.add(n,m);
        /**
        * 第一次運行報錯Index: 8, Size: 0說明動態(tài)數(shù)組arraylist在此前都沒有被調(diào)用
        
         */
    }
    void printGroup(){
        for(int i = 0;i<list.size();i++){
            System.out.println("Name: "+ list.get(i).getstuname()+"\tsex: "+ list.get(i).getSex()+ "\tNum: "+list.get(i).getNum());
        }
    }
}

繼承的概念

類之間的繼承關(guān)系是面向?qū)ο蟮脑O(shè)計語言的基本特征。
同類事物具有共同性,在同類事物中,每個事物又具有其特殊性。
通過抽象原則舍去對象的特殊性,抽取其共同性,則得到一個適用于一批對象的類,這就是一般類,而具有特殊性的類別稱為特殊類。
通過繼承原則,一般類具有一般類和特殊類共同的屬性和操作,這些在一般類中顯式的定義出來,在特殊類中不必重復(fù)定義。
特殊類的對象則擁有一般類的全部或部分(private除外)屬性和方法,即特殊類對一般類的繼承。

定義子類

java子類對父類的繼承使用extends語句。每個類只能與有一個父類。如果需要使用多個父類的方法,可以通過接口調(diào)用。

class cl extends cl2{
    ....
}

隱藏屬性

子類默認具有父類privat以外的數(shù)據(jù)成員,但是可以通過在子類申明同名的數(shù)據(jù)成員,將父類的數(shù)據(jù)成員隱藏起來。數(shù)據(jù)成員(屬性)的隱藏意味著父類的數(shù)據(jù)成員依然在,可以通過super進行訪問。

//SubclassHideDemo.java

class A1{
    int a1;
    A1(){
        a1 = 5;
    }
}
class A2 extends A1{
    int a1 = 10;
    int show1(){return a1;}
    int show2(){return super.a1;};
}
public class SubclassHideDemo{
    public static void main(String args[]){
        A2 ob = new A2();
        System.out.println(ob.show1() + "\t" + ob.show2());
    }
}
結(jié)果:
10  5

覆蓋方法

子類默認具有父類的非私有方法,可以直接調(diào)用。同時,子類可以構(gòu)造和父類數(shù)據(jù)類型,方法名,形參完全相同,而方法體不同的方法對父類的方法進行覆蓋。覆蓋顧名思義會將父類方法從內(nèi)存抹去,父類方法在子類對象中不再存在,但是子類方法中可以通過super調(diào)用父類被覆蓋的方法。

//SubclassCoverDemo.java

package com;

class A1{
    int a1 = 5;
    int b1 = 10;
    void print1(){
        System.out.println(a1);
    }
    void print2(){
        System.out.println(b1);
    }
}

class A2 extends A1{
    int a2 = 6;
    int b2 = 11;
    void print1(){
        System.out.println(a2);
    }
    void print3(){
        super.print2();
    }
}

public class SubclassCoverDemo{
    public static void main(String args[]){
        A2 ob = new A2();
        ob.print1();    //父類方法被覆蓋
        ob.print2();    //使用父類方法
        ob.print3();    //子類方法中通過super調(diào)用了父類被覆蓋的方法
    }
}
結(jié)果:
6
10
10

super和this的用法

在上一節(jié)中我們兩次使用了super這個修飾在子類中使用父類的成員和方法,這里對this和super做一個歸納。

  • this

this指向當前的對象自身,使用this標識當前對象的成員和方法,可以提高程序的清晰性,減少重名導(dǎo)致的錯誤。

  1. 用來訪問當前對象的數(shù)據(jù)成員
  2. 用來訪問當前對象的成員方法
  3. 當有重載的構(gòu)造方法時,用來引用同類的其他構(gòu)造方法
  • super

super指向當前對象的直接父類,當父類的成員和方法被隱藏和覆蓋,而需要引用他們時,可以通過super實現(xiàn)。

  1. 訪問直接父類被隱藏的數(shù)據(jù)成員
  2. 調(diào)用直接父類被覆蓋的成員方法
  3. 調(diào)用直接父類的構(gòu)造方法。

多態(tài)的概念

通過方法的重名現(xiàn)象提高代碼的抽象性和簡潔性。多態(tài)包括兩個層次,同一類下同一方法名的不同形參的使用方式——重載,和父子類下同一方法名的相同形參的使用方式——覆蓋(見上一節(jié))。

重載方法

重載方法是在同一類里對相同方法的不用使用形式,重載要求方法的數(shù)據(jù)類型方法名完全相同但是形參不相同,形參的不同表現(xiàn)在參數(shù)的個數(shù),數(shù)據(jù)類型和順序。

//Overload.java
package com;

class F{
    int i = 0;
    int j = 0;
    int k = 0;
    F(int i){
        this.i = i;
    }
    F(int i,int j){
        this(i);    //通過this調(diào)用本類的構(gòu)造方法
        this.j = j;
    }
    F(int i,int j,int k){
        this(i,j);
        this.k = k;
    }
    void Fprint(){
        System.out.println("i = " + i+ " j = " + j + " k = " + k);
    }
}
public class Overload{
    public static void main(String args[]){
        F f1 = new F(5);
        F f2 = new F(5,6);
        F f3 = new F(5,6,7);
        f1.Fprint();
        f2.Fprint();
        f3.Fprint();
    }
}
結(jié)果:
i = 5 j = 0 k = 0
i = 5 j = 6 k = 0
i = 5 j = 6 k = 7

今日代碼分析

java.util.ArrayList的用法和繼承

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,719評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,128評論 0 62
  • 一、繼承 當兩個事物之間存在一定的所屬關(guān)系,即就像孩子從父母那里得到遺傳基因一樣,當然,java要遺傳的更完美,這...
    玉圣閱讀 1,062評論 0 2
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,253評論 0 2
  • 1、振作起來,世界沒有你照樣轉(zhuǎn),別人沒有你照樣過得好,為何你就不能讓世界為你而變,讓自己過得比別人好呢?所以不要被...
    19閑云孤鶴閱讀 264評論 0 2