1. 程式人生 > >2018.10.9學習筆記

2018.10.9學習筆記

10.9學習筆記

今天學習了《Java程式設計思想》的第八章—多型,以及《大話設計模式》的第七章—代理模式,下面對今日學習收穫與疑惑作一個總結。


《Java程式設計思想》部分:

1.多型
多型是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定

2.動態繫結適用範圍:
①只有在子類中實現覆蓋的方法才能進行動態繫結,因此,static方法和final方法就不能進行動態繫結。
②資料域也不能進行動態繫結,任何域訪問操作都將由編譯器解析,因此不是多型的。

3.構造方法鏈:
當進行繼承時,我們已經知道了父類的一切,並且可以訪問父類任何宣告為public和protect的成員。這意味著,必須假定父類的所有成員都是有效的,即所有物件都已經建立

。為確保這一目的,唯一的方法就是首先呼叫父類構造器保證所有的父類成員以及當前成員的物件都被初始化了,這就是為什麼要首先呼叫所有父類的構造方法的原因。

4.構造器內部的多型方法的實現:
在父類的構造方法中呼叫子類的方法,就可能會出現父類呼叫的這個子類方法所操縱的成員可能還未進行初始化(在其他任何事物發生之前,將分配給物件的儲存空間初始化成二進位制的零),這樣做有一個優點,那就是所有的東西都至少初始化為零。但是,這種做法應該盡力的避免,編寫構造器時有一條有效的準則:用盡可能簡單的方法使物件進入正常狀態,如果可以的話,避免呼叫其它方法(除了父類的final方法)。
下面給出一個例子:

public class Glyph {
    public void draw(){
        System.out.println("Glyph.draw");
    }

    Glyph(){
        System.out.println("Glyph() before draw()");
        draw();
        System.out.println("Glyph() after draw()");
    }
}



public class RoundGlyph extends Glyph {
    private int radius = 1;

    RoundGlyph(int radius){
        this.radius = radius;
        System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
    }

    @Override
    public void draw() {
        System.out.println("RoundGlyph.draw, radius = " + radius);
    }
}



public class PolyConstructors {
    public static void main(String args[]){
        new RoundGlyph(5);
    }
}
/* output
Glyph() before draw()
RoundGlyph.draw, radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
 */


《大話設計模式》部分:

1.代理模式:
給某一個物件提供一個代理,並由代理物件來控制對原物件的訪問。
代理模式結構:
①Subject(抽象主題角色):聲明瞭真實物件和代理物件的共同介面
②Proxy(代理主題角色):包含了對真實物件的引用,可能還增添了新的方法。
③RealSubject(真實主題角色):實現了抽象主題角色中的抽象方法。


代理模式又可細分各種代理模式,例如(遠端代理、虛擬代理),是一種較為複雜和重要的一個模式,能力有限(涉及到了一些沒有學過的東西),今後在深入探索。