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(真实主题角色):实现了抽象主题角色中的抽象方法。


代理模式又可细分各种代理模式,例如(远程代理、虚拟代理),是一种较为复杂和重要的一个模式,能力有限(涉及到了一些没有学过的东西),今后在深入探索。

猜你喜欢

转载自blog.csdn.net/oQiShiYiGeRen/article/details/82990267