Java对象导论

Java对象导论

1.1 抽象过程

  • 万物皆对象。
  • 程序是对象的集合(即:),他们通过发送消息(调用方法)来告知彼此要做的。
  • 每个对象都有自己的由其他对象所构成的存储(引用其他对象或基本类型,即组合)。
  • 每个对象都拥有其类型。每个类最重要的区别于其他类的特征就是“可以发送什么样的消息给它”(即调用方法)。
  • 某一特定类型的所有对象都可以接受同样的消息。
  • 对象具有状态(成员属性)、行为(成员方法)和标识(引用的名称)。每个对象在内存中都有唯一的一个地址

 

1.2 每个对象都有一个接口

  • 在程序执行期间具有不同的状态而其他方面都相似的对象会被分组到对象的类中。
  • 每个对象都属于定义了特性和行为的某个特定的类。
  • 类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以可以把类当成是一个数据类型,例如所有浮点型数字具有相同的特性和行为集合。二者的差异在于,程序员通过定义类来适应问题,而不再被迫只能使用现有的用来表示机器中的存储单元的数据类型。
  • 每个对象都只能满足某些请求,这些请求有对象的接口所定义,决定接口的便是类型(即对象能够调用什么方法
  • 向某个对象“发送消息”(产生请求),这个对象便知道此消息的目的,然后执行对应的程序代码。
  • 为了向对象发送消息,需要声明对象的名称,然后以圆点符号连接一个消息请求

 

1.3 每个对象都提供服务

  • 当正在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为“服务提供者”,程序本身想用户提供服务,它将通过调用其他对象提供的服务来实现这一目的。
  • 将对象看做都是服务提供者还有一个附带的好处:它有助于提高对象的内聚性(内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合
  • 每个对象都有一个它所能提供服务的内聚的集合。在良好的面向对象设计中,每个对象都可以很好的完成这项任务,但是它并不试图做更多的事情。

1.4 被隐藏的具体实现

  • 将程序开发人员按照角色分为类创建者(那些创建新数据类型的程序员)和客户程序员(那些在其应用中使用数据类型的程序员)是大有裨益的。客户端程序员的目标是手机各种用来实现快速开发应用的类。类创建者的目标是构建类,这种类只想客户端程序员暴露必需的部分,而隐藏其他部分
  • 访问控制的一个存在原因就是让客户端程序员无法触及他们不应该触及的部分——这部分对于数据类型的内部操作是必须的,但并不是用户解决问题所需的接口的一部分
  • 访问控制第二个存在原因是允许库设计者可以改变内部的工作方式而不用担心会影响到客户端程序员

1.5 复用具体实现

  • 最简单的复用某个类的方式就是直接使用该类的一个对象,还可以将哪个类的一个对象置于某个新的类中。我们称其为“创建一个成员对象”。新的类可以由任意数量,任意类型的其他对象以任意可以实现新的类中想要的功能的方式所组成。因为是以现有的类合成新的类,所以称为组合
  • 组合带来了极大的灵活性。新类的成员对象通常被声明为private,使得使用新类的客户端程序员不能访问他们。这也使得你可以在不干扰现有客户端代码的情况下,修改这些成员。也可以在运行时修改这些对象,以实现动态修改程序的行为。

1.6 继承

  • 在创建了一个类后,及时另一个类与其具有相似的功能,你还是得重新创建一个新类。如果我们能够以现有类为基础,复制它,然后通过添加个修改这个副本来创建新类就要好多了。通过继承便可以达到这样的效果。
  • 一个基类型包含其所有导出类型所共享的特性和行为。可以创建一个基类型来表示某些对象的核心概念,从基类型来导出其他类型,来表示此核心可以被实现的各种不同方式。
  • 当继承现有类型时,也就创造了新的类型。这个新的类型不仅包括现有类型的所有成员(尽管private成员被隐藏了起来,并且不可访问)。PS:所有private属性和方法都能被继承
  • 有两种方法可以使基类与导出类差生差异:一是直接再导出类中添加新方法;二是改变现有基类方法的行为,也是最重要的方法,称为覆盖。                 
  • 继承只覆盖基类的方法(而并不添加在基类中没有的新方法),导出类和基类有完全相同的接口,导出类可以完全被替代为一个基类对象(导出类对象和基类对象可以调用的方法是一样的)。
  • 有时必须在导出类型中添加新的接口元素,这样也就扩展了接口。这个新的类型仍然可以替代基类,但是这种替换并不完美(父类引用指向子类对象,则子类对象只能调用父类中已有的方法)。

1.7 伴随多态的可互换对象

  • 编译器不可能产生传统意义上的函数调用,一个非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定(即在编译期间就确定了运行时将调用哪段代码
  • 当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用的方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的语言被称为是弱类型的),但是还不知道将被执行的确切代码。

1.8 单根继承结构

  • 所有类都继承于顶级父类Object

1.9 容器

  • 一种对象类型,这种对象类型持有其他对象的引用,称为容器(也称为集合),可以再运行期间动态的改变容量大小
  • 不同类型的容器提供了个不同的接口和外部行为。
  • 不同的容器由于底层结构的不同,对某些操作具有不同的效率(如ArrayList和LinkedList)。
  • 根据不同的情况选择不同的容器,如在一开始使用LinkedList构建程序,而在优化系统性能时改用ArrayList。接口List所带来的抽象,把在容器之间进行转换时对代码产生的影响降到最小限度。
  • 参数化机制(即泛型),可以自动定制作用于特定类型上的类,避免向上向下转型带来的资源消耗和安全性问题。

1.10 对象的创建和生命周期

  • java只允许在堆上创建对象(通过new关键字),并且有垃圾回收器以守护线程的方式在适当的时候自动清理不再被使用的对象。

1.11 异常处理:处理错误

  • 异常提供了一种从错误情况进行可靠恢复的途径,现在不再是只能退出程序,你可以经常进行校正,并恢复程序的执行,这些都有助于编写出更健壮的程序。

1.12 并发编程

  • 程序能够停下正在做的工作,转而处理某个其他问题。
  • 有时中断对于处理时间性强的任务是必须的,但是对于大量的其他问题,我们只是想把问题分割成多个可独立运行的部分(任务),从而提高程序的响应能力。这些彼此独立运行的部分称之为线程,上述概念被称为“并发”。
  • 多线程带来的便利之一是程序员不再关心机器上是由多个处理器还是一个处理器。
  • 某个任务锁定某项资源,完成其任务,然后释放资源锁,使其他任务可以使用这项资源,防止多个线程同时访问同一个资源时带来的线程安全问题

1.13 Java与internet

  • 此处省略一万字。。。

 

 参考:Java编程思想中文版第四版第一章

 

posted @ 2019-12-05 23:18  倔强的403  阅读(274)  评论(0编辑  收藏  举报