第一章 什么是对象

1.1 抽象的历程

”对象“:问题空间中的元素及其解决方案空间中的具体呈现。

理念即是通过添加各种新的对象,可以将程序改编为一种描述问题的语言。

对象是具有状态、行为及标识的。

对象可以拥有自己的内部数据(用以赋予状态),方法(用以产生行为),对象在内存中都有唯一的地址。

1.2 对象具有接口

关键字class的由来:状态不同但结构相同的对象汇聚在一起而组成的同一类对象。

类是描述了一系列具有相同特征(即数据元素)和行为(即功能方法)的对象,也就是说类其实是数据类型。

在面向对象领域中,我们将创建的变量称为”对象“或者”实例“,将操作变量称为”发送消息“或者”发送请求“。

让一个对象真正的发挥其作用就是向对象发送请求。而对象能够接收什么请求,是由其接口决定,对象所归属的类则定义了这些接口。

eg:

类型名 Light
接口 on()
off()
brighten()
dim()
Light lt=new Light();
lt.on();

接口定义了能向这个对象发送的请求。

代码+隐藏的数据=”实现“

1.3 对象可以提供服务

在开发一个面向对象程序或者理解其设计时,可以将对象想象成”服务提供者“。程序是为用户提供服务的。

高内聚性:设计的组件(比如对象、方法、对象库等)无论从哪个方面都整合的很好。

1.4 隐藏的实现

程序员的两大阵营:”类的创建者“(负责创建新数据类型的人),”客户程序员“(在自己的应用程序里使用现有数据类型的人)。

”类的创建者“:只暴露必要的接口给客户程序员,同时隐藏其他所有不必要的信息。这样可以避免修改隐藏信息时对其他人造成的影响,即是隐藏代码的具体实现可以有效的减少程序的bug。

设置访问控制

首要原因:防止客户程序员接触本不应该接触的数据类型内部运转的代码(即非那些用于解决特定问题的接口部分)。

第二个原因:让接口部分和实现部分分离,便于库的设计者在改变类的内部工作机制时,不用担心影响到使用该类的客户程序员。

Java提供了三个显示的关键字(访问修饰符)来设置访问控制:

  1. public:可被所有人访问
  2. private:只能被类的创建者通过该类自身的方法访问
  3. protected:与private相似,但继承的子类可以访问protected成员

还有一种默认的访问权限,即是包访问(package access)

1.5 复用实现

复用一个类的最简单方法就是直接使用该类所生成的对象。

组合:新创建的类可以由任意数量和类型的对象组成,也可以任意组合这些对象以满足想要的功能,即是利用已有的类组合成一个新的类。(如果组合是动态的,通常称为聚合

1.6 继承

为了避免重复性代码的书写(即创建功能相近的类),我们复制了现有的类并且能够在此基础上再做一些增补,这就是继承的好处。

子类可继承父类的所有成员变量和方法及接口,同时子类可以增加或者复写父类没有或者已有的成员变量和方法及接口。

区分子类和父类很简单,第一种直接为子类添加新的方法,那么执行时,父类的行为讲会和你的预期不符。第二种就是重写方法,可以让子类与父类增加差异化。

is-a关系与is-like-a关系

替换原则(里氏替换原则):即当只重写父类中定义的方法时,子类和父类的类型将会是完全相同的(接口一模一样),这样我们就能够用子类的对象代替父类的对象。这是一种理想的继承方式,即是is-a关系

当我们为子类的接口添加新的内容时,子类依然能够代替父类的对象,但不饿能通过父类的接口获取子类的新方法,这种关系即是is-like-a关系

1.7 多态

当涉及类型层次的时候,将一个对象视为父类的一个实例,而不是对象实际的类。

不同子类执行父类的同一方法时的结果应该是不同的,那么我们可能需要的是派生子类,这样可以扩展程序设计的能力。

eg:

当Bird对象的move()方法被调用时,(Goose对象执行的是行走、飞翔或者游泳,Penguin对象执行的则是移动或者游泳)。

我们将子类视为父类从而能够区别不同对象的不同方法,这也是向上转型

前期绑定是非面向对象编译器的调用函数时所触发的,这样意味着当调用具体方法时,该方法名就决定了被执行代码的绝对地址。

但对于继承,程序需要运行时才能明确代码的地址,所以就有了面向对象使用的机制:后期绑定。(Java里会默认具备动态绑定特性,所以不用借助其他的关键字或者代码来实现多态,但c++会使用virtual关键字)

1.8 单根层次结构

单根层次结构有利于实现垃圾收集器,这也是Java相对于c++的一个重要改进。既然所有的对象都拥有类型信息,那么就不用再去了解某个对象具体是什么类型了,这个特性对于系统级别的操作尤其重要,比如异常处理。

1.9 集合

在大多数语言中,用数组就可以保存许多的内容。而Java中通常是创建一种新类型的对象,然后利用这个新对象来保存其他对象的引用,这个对象通常被叫做集合,并且会根据放入其中的内容而自行调整空间。

当然不同的集合也有着不同的用途:

几个不同的List类(用于保存序列),几个Map类(也叫做关联数组,用于关联对象),几个Set类(用于保存不同类型的对象),以及一些队列(queue)、树(tree)、栈(stack)等。

不同的集合在特定操作的执行效率上也有差异,比如:ArraytList和LinkedList,ArraytList随机获取元素是一种耗费固定时间的操作,意思就是不管你选择获取哪个元素,耗费的时间都是相同的,而LinkedList在列表中随机选择元素是一种代价很大的操作,查找列表更深处的元素也会耗费更多的时间。如果要在列表中插入元素,LinkedList耗费的时间会比ArrayList更少。

参数化类型(泛型)

当我们知道向上转型是安全的时,反过来我们不知道Object对象实际上是什么类型,那么这种向下转型就是不安全的,当然如果向下转型失败,会得到异常。

为了节省向下转型与其关联的运行检查所需要的时间,我们通常关注创建的集合能不能明确所包含的对象类型。

1.10 对象的创建和生命周期

C++需要显式删除对象,因为C++的宗旨是效率优先。

Java只允许动态分配内存。当创建一个对象时,需要new操作符来创建一个对象的动态实例。

Java语言的底层支持垃圾收集器机制,所以它会自动找到无用的对象并将其销毁。

1.11 异常处理

异常是从错误发生之处“抛出”的对象,而根据错误类型,它可以被对于的异常处理程序所“捕获”,当然异常不允许被忽略。

On Java 8读书笔记的更多相关文章

  1. java effective 读书笔记

    java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...

  2. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  3. Java并发读书笔记:线程安全与互斥同步

    目录 导致线程不安全的原因 什么是线程安全 不可变 绝对线程安全 相对线程安全 线程兼容 线程对立 互斥同步实现线程安全 synchronized内置锁 锁即对象 是否要释放锁 实现原理 啥是重进入? ...

  4. 单元测试之道Java版——读书笔记

    单元测试知道Java版读书笔记 首先我们必须要知道我们所写的代码,它的功能是什么,如果我们不了解代码的行为,那么也就无从测试. 我们测试的目的,是为了我们整个程序架构的稳定,代码其实就是欧文要实现功能 ...

  5. 《Effective Java》读书笔记(一)之创建和销毁对象

    最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的 ...

  6. 《Effective java》-----读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...

  7. 《practical Java》读书笔记

    题记: 花了一周把Peter Haggar的<practical Java>看了遍,有所感悟,年纪大了, 写下笔记,方便日后查看.也希望有缘之人可以看看,做个渺小的指路人. 不足之处还望指 ...

  8. 《Effective Java》读书笔记 - 11.序列化

    Chapter 11 Serialization Item 74: Implement Serializable judiciously 让一个类的实例可以被序列化不仅仅是在类的声明中加上" ...

  9. 《Effective Java》读书笔记 - 10.并发

    Chapter 10 Concurrency Item 66: Synchronize access to shared mutable data synchronized这个关键字不仅保证了同步,还 ...

  10. Think in java 4th读书笔记__last update20151130

    一周至少两章,去掉最后的并发和图形化用户界面,刚好需要2个半月才能学好.这进度感觉有点慢,所以做下调整吧,改成一个月会不会更好点^^,认认真真的把java的圣经给看一遍. 计划: 第1~6 11.17 ...

随机推荐

  1. 7、System类

    System类 常见方法 exit 退出当前程序 System.out.println("ok1"); //1. exit(0) 表示程序退出 //2. 0 表示一个状态,正常的状 ...

  2. Redis基本数据结构ZipList

    为什么要有ziplist 有两点原因: 普通的双向链表,会有两个指针,在存储数据很小的情况下,我们存储的实际数据的大小可能还没有指针占用的内存大,是不是有点得不偿失?而且Redis是基于内存的,而且是 ...

  3. MinIO管理员完整指南

    官方文档地址:http://docs.minio.org.cn/docs/master/minio-admin-complete-guide MinIO Client(mc)提供了" adm ...

  4. Traefik2.X 版本 中 URL Rewrite 的使用

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484594&idx=1&sn=becbe567 ...

  5. Beats processors

    文章转载自:https://elasticstack.blog.csdn.net/article/details/111321105 我们通常的做法是使用 Elasticsearch 的 ingest ...

  6. Service中spec.type 字段的值:ClusterIP和NodePort理解

    ClusterIP(默认) 在群集中的内部IP上公布服务,这种方式的 Service(服务)只在集群内部可以访问到 [root@master ~]# kubectl get service -n te ...

  7. 关于docker-环境部署及拉取镜像创建容器的过程记录

    背景:因安全部门要求对特定几台应用主机的进行漏洞及脆弱性扫描,使用的工具需要基于docker环境,即他们提供镜像,让我们创建成容器,于是将整个环境安装及创建docker容器的过程记录于此 1.还是先得 ...

  8. PHP全栈开发(八):CSS Ⅵ 列表 style

    列表分为有序列表和无序列表 我们知道有序列表的标签是<ol>意思是order list 无序列表的标签是<ul> 列表里面每项的标签用<li>来进行包裹. 使用CS ...

  9. useEffect 和 useLayoutEffect浅析

    执行时期的区别 useEffect 回调函数的执行时期 useEffect为异步执行,执行时期为 触发状态更新(如:setState,forceUpdate) React渲染函数执行(render) ...

  10. Java云原生崛起微服务框架Quarkus入门实践

    @ 目录 概述 定义 GraalVM简介 为何使用 特性 官方性能 实战 入门示例 步骤 安装GraalVM 创建quarkus工程 Idea导入项目 Idea运行和调试 打包成普通的Jar 打包成依 ...