面向对象导论

1.纯粹的面向对象程序设计方式
    1)万物皆为对象。将对象视为奇特的变量,它可以存储数据。
    2)程序是对象的集合,它们通过发送消息来告诉彼此所要做的。
    要求请求一个对象,就必须对该对象发送一条消息。(可以把消息想象为对某个特定对象的方法的调用请求)
    3)每个对象都有自己的由其他对象所构成的存储。可以通过创建包含现有对象的包的方式来创建新型的对象。
    4)每个对象都有其类型。每个对象都是某个类(class)的一个实例(instance),每个类最重要的区别于其它类的
    特性就是“可以发送什么样的消息给它”。
    5)某一特定类型的所有对象都可以接收同样的消息。这是一句意味深长的表述,比如鸟类下的所有具体的鸟类,
    所有具体的鸟类都可以飞,所以一个具体的鸟类必定能够接受发送给鸟类型对象的消息飞起来。
    这种可替代性是OOP中最强有力的概念之一。

2.每个对象都提供服务
    当正在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为“服务提供者”。
    程序本身将向用户提供服务,将对象看作是服务提供者还有一个附带的好处:它有助于提高对象的内聚性。
    高内聚是软件设计的基本质量要求之一:这意味着一个软件构件的各个方面“组合”得很好。

3.被隐藏的具体实现
    将呈现开发人员按照角色分为类创建程序员和客户端程序员。客户端程序员的目标是收集各种用来
    快速应用开发的类。类创建程序员的目标是构建类,这种类只向客户端程序员暴露必须的部分,而隐藏其它的部分。
    为什么要这样呢?因为如果加以隐藏,客户端程序员将不能够访问它,这意味着类创建程序员可以任意修改被隐藏的部分,
    而不必担心对其他任何人造成影响。被隐藏的部分通常代表对象内部脆弱的部分,它们很容易被粗心的或不知内情的
    客户端程序员所毁坏,因此将实现隐藏起来可以减少程序bug。

    java用三个关键字在类的内部设定边界:public、private、protected。
    public 紧随其后的元素对任何人都是可用的。
    private 除了类型创建者和类型的内部方法之外的任何人都不能访问的元素。
    protected 与private作用相当,差别仅在于继承的类可以访问protected成员,但不能访问private成员。
    默认包访问权限 :当没有使用前面所提到的任何访问指定词时,他将发挥作用,在这种权限下,
    类可以访问在同一个包中的其他类的成员,但是访问包之外默认权限,如同访问private。

4.复用具体实现
    代码复用是面向对象程序设计语言所提供的最了不起的优点之一。
    一旦类被创建并测试完,理想情况下代表一个有用的代码单元。产生一个可复用的对象设计需要丰富的
    经验和敏锐的洞察力。一旦你有了这样的设计,它就可供复用。

    最简单的复用某个类的方式就是直接使用该类的一个对象,此外也可以将那个类的一个对象置于某个新类中。
    称其为“创建一个成员对象”。新的类可以由任意数量、任意类型的其他对象以任意可以实现
    新类中想要的功能的方式所组成。因为是在使用现有的类合成新的类,这种概念被称为组合(composition),
    如果组合是动态发生的,那么称它为聚合(aggregation)。组合经常被视为“has-a”(拥有)关系。

    组合带来了极大的灵活性。但是继承的概念新手程序员就会有这样的印象:复用代码应该使用继承。
    实际上,在建立新类时,应该首先考虑组合,因为它更简单灵活。如果采用这种方式,设计会变得更加清晰。
    一旦有了一些经验之后,便能够看出必须使用继承的场合了。

5.继承
    在创建了一个类后,即使另一个新类其具有相似的功能,你还是得创建一个新类。如果我们能够以现有的类为基础,
    复制它,然后通过添加和修改这个副本来创建新的类那就要好多了。通过继承便可以达到这样的效果,
    当源类(基类、超类或父类)发生变动时,所有被修改的“副本”(导出类、继承类或子类)受影响反映出变动。

    类型不仅仅只是描述了作用于一个对象集合上的约束条件,同时还有与其他类型之间的关系。
    两个类型可以有相同的特性和行为,但是其中一个类型可能比另一个含有更多的特性,并且可以处理更多的消息。

    由于基类和导出类具有相同的基础接口,如果只是简单的继承一个类而并不做其他任何事,那么基类接口中的方法将会直接
    继承到导出类中。这意味着导出类的对象不仅与基类拥有相同的类型,而且还拥有相同的行为,这样做没有什么特别意义。

    虽然继承有时可能意味着在接口中添加新方法,但并非总须如此。
    使导出类和基类之间产生差异的方法是改变现有基类的方法的行为,这被称为覆盖(overriding)那个方法。

扫描二维码关注公众号,回复: 8746463 查看本文章

6.伴随多态的可互换对象
    在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将其当作其
    基类的对象来对待。这使得人们可以编写出不依赖于特定类型的代码。发送给基类的消息导出类一样可以接受。
    需要注意的是,在导出类添加新的接口元素,新类替代了基类,但是这种替代并不完美,
    因为基类无法访问新添加的数据成员。

    多态中如果不需要知道哪一段代码会被执行,那么添加新的子类型时,就能够执行不同的子类重写后的方法。因此编译器无法精确地了解
    哪一段代码将会被执行,那么它该怎么办呢?
    为了解决这个问题,面向对象程序设计语言使用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才能确定。
    编译器确保被调用方法存在,并对调用参数和返回值执行类型检查,但是并不知道被执行的确切代码。
    
    为了执行后期绑定,java使用一小段特殊的代码来替代绝对地址调用,这段代码使用在对象中存储的信息来计算方法体的地址。
    这样,每一个对象都可以具有不同的行为表现。当向一个对象发送消息时,该对象就能够知道对这条消息应该做什么。

7.单根继承结构
    java中所有类的终极基类的名字是Object。所以它们归根到底都是相同的基本类型。
    单根继承结构使垃圾回收器变得容易得多,而垃圾回收器正是java相对C++的重要改进之一。
    由于所有对象都保证具有其类型信息,因此不会因无法确定对象的类型而陷入僵局。
    这对于系统级操作(如异常处理)显得尤其重要,并且给编程带来了更大的灵活性。
    (去除C++多继承换取额外的灵活性)

本文章内容摘要《Java面向对象编程思想4》

发布了13 篇原创文章 · 获赞 15 · 访问量 941

猜你喜欢

转载自blog.csdn.net/qq_42470947/article/details/103756579