《JAVA编程思想》读书笔记1——OOP思想

来源:互联网 发布:loco加速器网络不可用 编辑:程序博客网 时间:2024/04/23 16:20

面向对象思想

JAVA是一种面向对象编程语言,它基于Smalltalk语言,作为OOP语言,它具有以下五个基本特性

  • 万物皆对象,每一个对象都会存储数据,并且可以对自身执行操作。因此,每一个对象包含两部分:成员变量和成员方法。在成员方法中可以改变成员变量的值。
  • 程序是对象的集合,他们通过发送消息来告知彼此所要做的事情,也就是调用相应的成员函数。
  • 每一个对象都有自己的由其他对象所构成的存储,也就是说在创建新对象的时候可以在成员变量中使用已存在的对象。
  • 每个对象都拥有其类型,每个对象都是某个类的一个实例,每一个类区别于其它类的特性就是可以向它发送什么类型的消息,也就是它定义了哪些成员函数。
  • 某一个特定类型的所有对象都可以接受同样的消息。

另一种对对象的描述为:对象具有状态(数据,成员变量)、行为(操作,成员方法)和标识(成员名,内存地址)。

面向对象语言其实是对现实生活中的实物的抽象,而在我们实际的代码编写过程中,通常需要创建的类还包括很多不存在的事物,类似于实际存在的物体,定义类之前需要首先构思它拥有什么(需要定义哪些成员变量,分别是什么类型)、能够对它执行什么操作(需要定义哪些方法以及这些方法对成员变量的改变)。一旦类被建立,就可以在根据需要创建任意多个对象,不同对象可能拥有不同的成员变量(以此来表现它们的不同),然后通过方法操作它。

每个对象能够接受的请求(消息)由对象的接口所定义,而在程序中必须由满足这些请求的代码,这段代码称之为这个接口的实现。当向某个对象发送消息(请求)时,这个对象便知道该消息的目的(该方法的实现已定义),然后执行相应的代码。

每一个对象都提供服务

在设计对象时,较好的方法时将对象视为”服务提供者”,将该类的使用者想象成其它人(称之为用户),那么在设计的时候首先就要明确该对象需要哪些对象作为输入以及需要提供哪些接口供用户使用。这个过程一般是一个循序的过程,有时候会因为一个小功能而定义某个类,然后随着该类满足的需求增加则持续的增加一些新的成员变量和方法,如果一个类实现的功能过多,此时就需要考虑是否可以对此进行拆分。

通常,对于一个类有两种角色:类创建者和类使用者,通常情况下这两个角色是同一个人,但是对一些向外部提供的jar文件,使用者可能有很多。类创建者的目标是构建类,决定暴露给用户哪些,隐藏哪些。这样的一层关系可以划清两者之间的界限,使用者只需要理解他能够使用的接口,而创建者可以随意修改隐藏的部分。此时就能够彰显出接口的重要性。两个角色的沟通通过接口展现,此时最常见的方式创建者整理暴露出的接口文档,而使用者主需要根据该文档使用。

谈到了暴露和隐藏,就不得不提到java提供的访问控制:public、private和protected,public表示所有人可见、private表示只有类创建者和内部方法可见,protected类似于private,区别在于前者修饰的成员对子类是可见的。当不指定这三种权限控制时,java使用默认的权限,即包访问权限,表示它可以被该package下的方法使用。

当创建者和使用者建立基于接口的关系之后,就能够带来提高内聚性的好处,而这种方式也被称作:面向接口编程,而非面向实现编程。这样也就带来理想情况下的“高内聚,低耦合”。

组合和继承

随着代码量的增加,我们会发现一些代码会被重复编写,通常可以通过使用该类的一个对象来复用一个类,这种使用已存在的类组合成新的类称之为组合,组合能够带来较大的灵活性,通常会把该对象设置为private使得新类的使用者不能访问它们,屏蔽的好处就是当实现需要修改该成员时不会对现有用户造成任何影响。

继承是OOP语言最基本的特性之一,当继承现有类型(基类)的同时也创建了一个新类(派生类),新类不仅包含现有类的成员(即使是private成员也是包含的,只不过在新类中不能访问它),它还复制了现有类的接口,这样就使得向现有类对象发送的消息都可以发送给新类的对象。有两种方式可以使得派生类和基类产生差异:1、在基类的基础上增加新的接口,这样派生类具有了特有的特性;2、实现在基类中已经实现的接口,称之为覆盖。

对于一个非面向对象编译器(例如C编译器)产生的函数调用会引起所谓的“前期绑定”,它意味着编译器将产生一个具体函数名的调用,在运行时将这个调用解析成要执行得代码的绝对地址,而随着继承的使用,程序直到运行时才知道发送消息的对象和执行代码的地址。为了解决这个问题,OOP语言使用“后期绑定”,当向对象发送消息时被调用的代码直到运行时才确定,编译器只保证方法的存在。

在java中实现OOP区别于C++的最大特点就是所有的类都继承自单一的基类,并且每一个类只能拥有一个唯一的派生类,java中所有的终极父类成为Object(它是所有没有基类的类的基类),它拥有一些方法,这使得java中所有的类都会可以覆盖某些方法。

总结

本文主要介绍了一些OOP编程的基础和思想,大部分是基于《JAVA编程思想》的内容和个人的理解。

0 0