国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【Thinking in Java】編寫構造器時應注意:盡量避免調用其他非private方法

2019-11-15 01:03:50
字體:
來源:轉載
供稿:網友
【Thinking in java】編寫構造器時應注意:盡量避免調用其他非PRivate方法

  最近重溫了《Thinking in Java》,發現了一個讓我為之興奮的知識漏洞,必須得分享一下。

  上一篇的《Java類初始化的過程》的隨筆中,那個初始化順序并不完整。初始化的實際過程是:

    1.   在其他任何事物發生之前,將分配給對象的存儲空間初始化成二進制的0;
    2.   如上一篇的《Java類初始化的過程》那樣:父類的static成員變量和方法-->該類的static變量和方法-->開始實例化-->父類的普通成員變量和方法-->父類的構造方法-->該類的普通成員變量和方法-->該類的構造方法-->實例化結束

  然而,我們知道,當子類Sub繼承了父類Sup、并重寫了父類的方法draw()后,我們即使向上轉型為父類(即Sup sup=new Sub()),當我們調用sup.draw()方法的時候,它實際上調用的是Sub的draw方法。這里就有個坑了!

  如果在父類的構造方法里調用draw()方法,從邏輯上,我們以為是調用父類的draw()方法,而實際上,即使在父類的構造器以內,Java編譯器讓它調用的還是子類的draw()方法。

  我們用一個例子來展示一下:

  

public class Glyph {    Glyph(){        System.out.println("Glyph before draw()");        draw();         //邏輯上本應該調用本類的draw(),然而結果不是        System.out.println("Glyph after draw()");    }    void draw(){        System.out.println("Glyph.draw()");    }}public class RoundGlyph extends Glyph{    private int radius=1;    public RoundGlyph(int r) {        radius=r;        System.out.println("RoundGlyph.RoundGlyph(),radius="+radius);    }    @Override    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

  看打印的第二行,邏輯上我們打印的本應該是Glyph.draw(),然而它被子類覆蓋了。而且,就算打印的是RoundGlyph.draw(),radius=0,那radius應該等于1才對??!不是的,按照類的初始化順序,先初始化的是父類Glyph的構造器,然后才輪到初始化RoundGlyph的成員變量radius。之所以radius=0,是因為Java類的加載機制的準備階段,即在用戶初始化變量之前,就已經為變量初始化為0了,關于Java虛擬機的類加載機制,可以看下《深入理解Java虛擬機》一書的第7章。

  這種bug很難查找,但是又會破壞程序本身,讓我們忘bug興嘆。

  所以我們在對構造器進行初始化的時候,要盡量簡單,盡量避免在構造方法內調用其他public的非構造方法(private方法可以調用,因為它不可被繼承)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙门县| 靖远县| 赞皇县| 云龙县| 临泽县| 汪清县| 乐陵市| 夏河县| 塔河县| 柳州市| 华阴市| 临安市| 绥江县| 韩城市| 屏山县| 青川县| 南部县| 吉水县| 大渡口区| 高雄县| 唐河县| 北安市| 巴塘县| 资中县| 昂仁县| 昆明市| 哈巴河县| 佛山市| 阳原县| 星座| 博白县| 贵德县| 上高县| 四平市| 芜湖县| 大石桥市| 临潭县| 汾西县| 华安县| 万宁市| 佛坪县|