<code>2018年1月7日15:45:58</code>java
做为学习Java语言的经典之做《Java编程思想》,经常被人提起。虽然这本书出版十年有余,可是内容仍是很给力的。不少人说这本书不是很适合初学者,我也是这么以为(拙见),你最好熟悉一门高级语言,这样比较容易看懂。这本书也许不如国内一些教材那样,知识点精炼、简洁,可是大神Bruce Eckel更多讲的是Java编程思想,深刻浅出。曾在某文章中看到过有人把这本书看过十遍,每看一遍都有不一样的收获,但愿多年后我也有这样的收获。程序员
做为母校的教材(英文版),当我再次捧起这本书(中文版)的时候,我已再也不是学生,以此系列文章记录本身的感悟与收获。面试
ps:英文原版《Thinking in Java》,在毕业的时候,以四毛一斤的高价卖给了收二手书的,想当初花了一百多人民币买回来,如今连尾数都收不回。编程
总结:正如书上说的数组
本章将向读者介绍包括开发方法概述在内的OOP的基本概念。 本章介绍的是背景性的和补充性的材料。安全
第一章主要是叙述了面向对象的基本概念,和全书所讲述的内容的提纲,包括java语言三大特性:封装、继承、多态,容器,泛型,对象的生命周期,异常,并发,以及JavaWeb的相关知识。并发
全部编程语言都提供抽象机制。能够认为,人们可以解决的问题的复杂性直接取决于抽象的类型和质量。iphone
编程语言的由来,其实和人类语言的由来同样的,抽象出来的啊。我说“苹果”,那个圆圆的、红红的、甜的东西就出如今你脑海中,你要说是青色的,你要说是iphone,那我也没办法。可是“苹果”就是从这些东西抽象出来的文字形式,它是从一个砸过牛顿的圆圆的、红红的、甜的东西抽象出来的。可是若是没有“苹果”这个词,咱们是否是要说描述很长很长或者随身带一个“苹果”。计算机只认识0和1。编程语言
汇编语言是对底层机器的轻微抽象。接着出现的许多所谓“命令式”语言(如FORTAN、BASIC、C等)都是对汇编语言的抽象。函数
Java也是从底层语言抽象出来的,站在巨人的肩膀上。
面向对象的五个基本特性(Alan Kay总结):
1)万物皆为对象。 2)程序是对象的集合,它们经过发送消息来通知彼此所要作的。 3)每一个对象都有本身的由其余对象所构成的存储。 4)每一个对象都拥有其类型。 5)某一特定类型的全部对象均可以接收一样的消息。
Booch对对象提出了一个更加简洁的描述:
对象具备状态、行为和标识。
接口肯定了对某一特定对象所能发出的<i>请求</i>。可是,在程序中必须有知足这些请求的代码。这个代码与隐藏的数据以及构成了<i>实现</i>。
访问控制(Access Control)的第一个存在缘由就是让客户端程序员没法触及他们不该该触及的部分——这是部分对数据类型的内部操做来讲是必需的,但并非用户解决特定问题所需的接口的一部分。 访问控制的第二个存在缘由就是容许库设计者能够改变类内部的工做方式而不用担忧会影响到客户端程序员。 Java用三个关键字在类的内部设定边界:public、private、protected.
最简单地复用某个类的方式就是直接使用该类的一个对象,此外也能够<i>将那个类的一个对象置于某个新的类中</i>。咱们称其为“建立一个成员对象”。 由于是在使用现有的类,因此这种概念被称为组合(composition),若是组合是动态发生的,那么它一般被称为聚合(aggregation)。 组合常常被视为“has-a”(拥有)关系。
若是子类继承父类,没有添加新的方法,是is-a关系。
若是子类继承父类,添加新的方法,是is-like-a关系。
多态出现的缘由:
在处理类型的层次结构时,常常想把一个对象不看成它所属的特定类型来对待,而是将其看成其基类的对象来对待。
实现多态意味着:
编译器不可能产生传统意义上的函数调用。
一个非面向对象的编译器产生的函数调用会引发所谓的前期绑定,意味着编译器将产生对一个具体函数名字的调用,而运行是将这个调用解析到将要被执行的代码的绝对地址。然而在OOP中,程序直到运行是才可以肯定代码的地址。
为了解决这个问题,面向对象程序设计语言使用了<i>后期绑定</i>的概念。 为了执行后期绑定,Java使用一小段的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体。这样,根据这一小段代码的内容,每一个对象均可以据用不一样的行为表现。 在Java中,动态绑定是默认行为,不须要添加额外的关键字来实现多态。
在Java中,<strong>全部的类最终都继承自单一的基类object</strong>。
好处:
在单根继承结构中的全部对象都具备一个共用接口,因此它们归根到底都是相同的基本类型。 单根继承结构保证全部对象都具有某些功能。 单根继承结构使垃圾回收器的实现变得容易得多。
容器:
建立另外一种对象类型。这种新的对象类型特有对其余对象的引用。
在Java中,具备知足不一样须要的各类类型的容器:
List(用于存储序列), Map(也被成为关联数组, 用来创建对象之间的关联),set(每种对象类型只持有一个),以及以及租入队列、树、堆栈等更多的构件。
须要多种类型的容器的缘由:
第一,不一样的容器提供了不一样类型的接口和外部行为。 第二,不一样的容器对于某些操做具备不一样的效率。 咱们能够根据不一样的需求选择不一样的容器。面试的时候最多问到的问题之一应该有这个吧,关于ArrayList和LinkedList的区别。 在ArrayList中,<i>随机访问元素</i>是一个花费固定时间的操做;可是,对LinkedList来讲,随机选取元素须要在列表中移动,这种代价是高昂的,访问越靠近表尾的元素,花费的时间越长。 而另外一方面,若是想在序列中间<i>插入</i>一个元素,LinkedList的开销却比ArrayList要小。
知道它们的底层构造,理解起来就不是那难了,ArrayList存放对象的空间在物理上是连续的,底层是Array(数组),LinkedList存在对象的空间在物理上不必定是连续的。
这比如这里有一群孩子在操场上体育课,一开始孩子们要排队报个数,这样老师说3号孩子出来,就能够立刻找到,这是<i>随机访问元素</i>。接着有一个孩子迟到了,而后这个孩子<i>插入</i>到队伍中,就须要挪一个位置给他,若是他在4号位置上,那么这样在4号后的孩子们都要挪。报完数就自由活动了,这时候又来了一个迟到的孩子X,老师心情正好,由于男友说今晚一块儿去吃大餐,就不责备孩子X了,说去玩吧,这个孩子就<i>插入</i>在操场上玩耍的大部队里了。接着校长过来讲要找X孩子,假设每一个孩子只认识一个孩子,这样老师在操场边拉了一个孩子A说,我要找孩子X,孩子A只能告诉他认识的孩子B,继而B告诉C,如此循环,直到找到X,这就是<i>随机访问元素</i>。
这是个小故事,前者是ArrayList,后者是LinkedList。
在Java SE5出现以前,容器存储的对象都只具备Java中的通用类型:Object。 单根继承结构意味着全部东西都是Object类型,因此能够存储Object的容器能够存储任何东西。 把将派生类看作它的基类的过程称为<i>向上转型</i>。
向上转型成Object是安全的,若是从Object向下转型为具体类型,除非确切知道所要处理的对象的类型,不然向下转型是不安全的。
参数化类型机制的缘由:要建立知道本身所保存的对象的类型的容器,不须要向下转型以及消除犯错误的可能。
在Java中,参数化类型称为<i>泛型</i>。
在使用对象时,最关键的问题之一即是它们的生成和销毁方式。 每一个对象为了生存都须要资源,尤为是内存。
C++认为效率控制是最重要的议题:
为了追求最大的执行速度,对象的存储空间和声明周期能够在编写程序时肯定,这能够经过将对象置于堆栈(它们有时被称为自动变量(automatic variable)或限域变量(scoped variable))或静态存储区来实现。
Java采用动态内存分配方式。
在称为堆(heap)的内存池中动态地建立对象。 由于存储空间是在运行是被动态管理的,因此须要大量的时间在堆中分配存储空间,可能要远远大于在堆栈中建立存储空间的时间。 动态方式有这样一个通常性的逻辑假设:对象趋向于变得复杂,因此查找和释放存储空间的开销不会对对象的建立形成重大冲击。
这里有一个翻译的坑,之前我不知道:堆栈是栈。
Java对象生命周期:
若是是在堆上建立对象,编译器就会对它的生命周期一无所知。 Java提供了被称为“垃圾回收器”的机制,它能够自动发现对象什么时候再也不被使用,并继而销毁它。
开始于new,终结于GC。
垃圾回收器:
垃圾回收器提供了更高层的保障,能够避免暗藏的内存泄露问题。 Java垃圾回收器被设计用来处理内存释放问题(尽管它不包括清理对象的其余方面)。 垃圾回收器“知道”对象什么时候再也不被使用,并自动释放对象占用的内存。这一点同全部对象都是继承自单根基类Object以及只能以一种方式建立对象(在堆上建立)这两个特性结合起来。
异常提供了一种从错误情况进行可靠恢复的途径。
在计算机编程中有一个基本概念,就是在同一时刻处理多个任务的思想。
JavaWeb相关叙述,略过。
过程式语言:
数据定义和函数调用。
Java程序:
用来表示问题空间概念的对象(而不是有关计算机表示方式的相关内容),以及发送给这些对象的用来表示在此看空间内的行为的消息。
最后的最后,做者说,这章能够跳过。我?!