第八章:多態(tài)

向上轉(zhuǎn)型

  • 向上轉(zhuǎn)型:把對某個對象的引用視為對其基類型的引用的做法被稱作為向上轉(zhuǎn)型

  • 后期綁定:在運行時根據(jù)對象的類型進行綁定苔巨,也叫作動態(tài)綁定或者運行時綁定勉抓;在Java中除了staticfinal方法(private也屬于final方法)之外装蓬,其它所有的方法都是后期綁定灿渴;Java中所有的方法都可以通過后期綁定實現(xiàn)多態(tài)

  • 只有非private方法才可以被覆蓋(重寫)下梢,但是還是要密切注意覆蓋private方法的現(xiàn)象全肮,這時雖然編譯器不會報錯悬钳,但是也不會按照我們所期望的來執(zhí)行盐捷。確切的說柬脸,在導(dǎo)出類中,對于基類中的private方法毙驯,最好采用不同的名字

缺陷:域與靜態(tài)方法

  • 任何域的訪問操作都將由編譯器解析倒堕,因此不是多態(tài)的

    class Super{
        public int field = 0;
        
        public int getField(){
            return field;
        }
    }
    
    class Sub extends Super{
        public int field = 1;
        
        public int getField(){
            return field;
        }
        
        public int getSuperField(){
            return super.field;
        }
    }
    
    public class FieldAccess{
        public static void main(String[] args){
            Super sup = new Sub();
            System.out.println(sup.field); //0
            System.out.println(sup.getField()); //1
            
            Sub sub = new Sub();
            System.out.println(sub.field); //1
            System.out.println(sub.getField()); //1
            System.out.println(sub.getSuperField()); //0
        }
    }
    
  • 如果某個方法時靜態(tài)的,它的行為就不具有多態(tài)性爆价;靜態(tài)方法是與類綁定垦巴,而并非與單個的對象相關(guān)聯(lián)的

    class StaticSuper{
        public static String staticGet(){
            return "Base staticGet";
        }
        
        public String dynamicGet(){
            return "Base dynamicGet";
        }
    }
    
    class StaticSub extends StaticSuper{
        public static String staticGet(){
            return "Derived staticGet";
        }
        
        public String dynamicGet(){
            return "Derived dynamicGet";
        }
    }
    
    public class StaticMethod{
        public static void main(String[] args){
            StaticSuper sup = new StaticSub();
            System.out.println(sup.staticGet()); //Base staticGet
            System.out.println(sup.dynamicGet()); //Derived dynamicGet
        }
    }
    

構(gòu)造器和多態(tài)

  • 通常構(gòu)造器不同于其它種類方法,涉及到多態(tài)仍是如此铭段;盡管構(gòu)造器并不具有多態(tài)性(實際上是static方法骤宣,只不過static聲明是隱式的),但還是非常有必要理解構(gòu)造器怎樣通過多態(tài)在復(fù)雜的層次結(jié)構(gòu)中運作

  • 基類的構(gòu)造器總是在導(dǎo)出類的構(gòu)造過程中被調(diào)用序愚,而且按照繼承層次逐漸向上鏈接憔披,以使每個基類的構(gòu)造器都能得到調(diào)用

  • 復(fù)雜對象調(diào)用構(gòu)造器的順序:調(diào)用基類的構(gòu)造器按照聲明順序調(diào)用成員的初始化方法爸吮,調(diào)用導(dǎo)出類構(gòu)造器的主體

  • 在構(gòu)造器內(nèi)唯一能夠安全調(diào)用的那些方法是基類中的final方法或private方法芬膝,這些方法不能被覆蓋,不會出現(xiàn)在父類中調(diào)用子類重寫的方法形娇,而此時子類還沒有初始化的問題

    class Glyph{
        void draw(){
            System.out.println("Glyph.draw()");
        }
        
        Glyph(){
            System.out.println("Glyph() before draw()");
            draw();
            System.out.println("Glyph() after draw()");
        }
    }
    
    class RoundGlyph extends Glyph{
        private int radius = 1;
        
        RoundGlyph(int r){
            radius = r;
            System.out.println("RoundGlyph.RoundGlyph(), radius = "+radius);
        }
        
        void draw(){
            System.out.println("RoundGlyph.draw(), radius = "+radius)
        }
    }
    
    public class PolyConstructors{
        public static void main(String[] args){
            new RoundGlyph(5);
            //Glyph() before draw()
            //RoundGlyph.draw(), radius = 0
            //Glyph() after draw()
            //RoundGlyph.RoundGlyph(), radius = 5
        }
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锰霜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桐早,更是在濱河造成了極大的恐慌癣缅,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哄酝,死亡現(xiàn)場離奇詭異友存,居然都是意外死亡,警方通過查閱死者的電腦和手機陶衅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門屡立,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人万哪,你說我怎么就攤上這事侠驯÷崭眩” “怎么了奕巍?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長儒士。 經(jīng)常有香客問我的止,道長,這世上最難降的妖魔是什么着撩? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任诅福,我火速辦了婚禮匾委,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氓润。我一直安慰自己赂乐,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布咖气。 她就那樣靜靜地躺著挨措,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崩溪。 梳的紋絲不亂的頭發(fā)上浅役,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音伶唯,去河邊找鬼觉既。 笑死,一個胖子當著我的面吹牛乳幸,可吹牛的內(nèi)容都是我干的瞪讼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼粹断,長吁一口氣:“原來是場噩夢啊……” “哼尝艘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姿染,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤背亥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悬赏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狡汉,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年闽颇,在試婚紗的時候發(fā)現(xiàn)自己被綠了盾戴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡兵多,死狀恐怖尖啡,靈堂內(nèi)的尸體忽然破棺而出闹击,到底是詐尸還是另有隱情新娜,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布诬像,位于F島的核電站怠褐,受9級特大地震影響畏梆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一奠涌、第九天 我趴在偏房一處隱蔽的房頂上張望宪巨。 院中可真熱鬧,春花似錦溜畅、人聲如沸捏卓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽天吓。三九已至,卻和暖如春峦椰,著一層夾襖步出監(jiān)牢的瞬間龄寞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工汤功, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留物邑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓滔金,卻偏偏與公主長得像色解,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子餐茵,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344