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编程思想中文版第四版第一章

Java对象导论的更多相关文章

  1. JavaSE——Java对象导论

    一.抽象过程 人们所能够解决问题的复杂性直接取决于抽象的类型和质量.所谓抽象的类型指的是抽象的是什么,汇编语言是对底层机器的轻微抽象,命令式语言(FORTRAN.BASIC.C)是对汇编语言的抽象.这 ...

  2. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  3. Java编程思想读书笔记(一)【对象导论】

    2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...

  4. 《Java编程思想》读书笔记-对象导论

    计算机是头脑延伸的工具,是一种不同类型的表达媒体.本文以背景性的和补充性的材料,介绍包括开发方法概述在内的面向对象程序设计(Object-oriented Programming,OOP)的基本概念. ...

  5. java编程思想(1)--对象导论

    对象导论: 1.1 抽象过程 所有的语言都有抽象机制,抽象是解决复杂问题的根本方法.例如:汇编语言是对底层机器的轻微抽象.命令式语言(如:FORTRAN.BASIC.C)又是对汇编语言的抽象. jav ...

  6. Java 基础之一对象导论

    对象导论 1.1 抽象过程 所有编程语言都提供抽象机制.人们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象. 我们将问题空间中的元素及其再解空间中的表示称为对象.这 ...

  7. [Java编程思想] 第一章 对象导论

    第一章 对象导论 "我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来--除非赞成这个协定中规定的有 ...

  8. <Java编程思想>读书笔记(1)-对象导论、一切都是对象

    1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...

  9. 【Think In Java笔记】第1章 对象导论

    1. 对象导论 OOP 面向对象编程 C.Basic等语言所在的抽象仍要求在解决问题时基于计算机的解决,而不是基于所解决问题的结构来考虑. 要建立起问题空间的元素和解空间的对象之间一一映射的关系 万物 ...

随机推荐

  1. kubeadm配置高可用etcd集群

    操作系统为ubuntu18 kubernetes版本为v1.15.1 k8s默认在控制平面节点上的kubelet管理的静态pod中运行单个成员的etcd集群,但这不是高可用的方案. etcd高可用集群 ...

  2. MySql简单的增删改查语句 js

    最近在项目中需要连接数据库,做增删改查的功能,sql语句整理做了以下记录(基于NodeJs,注:data为你的真实数据): (一)新增插入表中数据: sql: 'insert into work(表名 ...

  3. Block循环引用问题

    根控制器没办法销毁,除非程序退出 从一个控制器跳到另外一个控制器,调用该控制器的pop方法才会销毁该控制器 self是一个强指针 在block中使用self时要注意循环引用的问题 最好将当前block ...

  4. oracle创建jobs定时任务报错:PLS-00306: wrong number or types of arguments in call to 'JOB'

    原脚本: begin  sys.dbms_job.submit(job => job,                      what => 'xxx;',              ...

  5. 华为云&#183;寻找黑马程序员#海量数据的分页怎么破?【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  6. Python微信公众号教程基础篇——收发文本消息

    1. 概述: 在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果 ...

  7. 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)

    题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...

  8. Thymeleaf语法

    Thymeleaf 官网:https://www.thymeleaf.org/ 1.入门示例 (1)在controller编写一个请求,放进去一些数据: @RequestMapping("/ ...

  9. Spring Cloud第五篇 | 服务熔断Hystrix

    ​ 本文是Spring Cloud专栏的第五篇文章,了解前四篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Clo ...

  10. webpack4.0(三)--动态生成html

    webpack4.0--动态生成html 前言: webpack-dev-server实现了自动编译刷新浏览器,让编译出来的bundle.js托关于服务器根路径(电脑内存)中去.使用--content ...