第一章 对象导论
1.1抽象过程
所有编程语言都是在提供对问题的抽象。汇编语言是对底层机器的抽象;命令式语言(如c)更加高级,但是它们的抽象仍旧基于计算机的结构;面向对象提供了表示“问题空间”元素的能力,可以基于问题进行抽象,而不是计算机。
面向对象的特点:
- 万物皆为对象
- 程序是对象的集合,它们通过发送消息告知彼此所要做的(即java中方法)。
- 每个对象都有由其他对象所构成的存储(即java中成员变量)。
- 每个对象都拥有其类型(即java中class)。
- 某一个特定类型的对象可以接受同样的消息(即同class)。
1.2 每个对象都有一个接口
类是描述具有相同特性和行为的对象集合。面向对象编程的过程,是为问题空间的元素和解空间的元素创建一一映射。
基于对象的特点来说
接口确定了某一个对象可以发送的请求,或者可以说成某一个对象具有的行为。
1.3 每个对象都提供服务
基于设计者的角度来说
将对象看作“服务提供者”。设计程序的过程,即考虑怎样创建提供理想服务的一系列对象。
1.4 被隐藏的具体实现
一个完整的程序(如点餐)可能需要基于多套服务(如定位,图片加载框架等)。
在设计类的时候,要从一个服务提供者的角度,考虑哪些接口是需要对外暴露的,哪些是需要隐藏的。
1.5 复用具体实现
代码复用方式
- 组合
- 聚合(动态发生的组合)
- 继承
组合比继承更灵活
1.6 继承
导出类和基类具有相同接口,导出类可以新增接口,也可以覆盖(override)基类的接口。
1.7 多态
实现方式:后期绑定
1.8 单根继承结构
1.9 容器
- 不同容器提供不同接口和外部行为;
- 不同容器对于某些操作具有不同效率。
1.9.1 参数化类型
泛型
1.10 对象的创建和生命期
垃圾回收机制
1.11 异常处理:处理错误
1.12并发编程
第二章 一切都是对象
- 引用
- new
存储到哪里
1). 寄存器
2). 堆栈 - 对象引用和基本类型存在堆栈中。java编译器需要知道堆>栈中所有元素的生命周期。
3). 堆 - 对象实体存在堆中
4). 常量池
5). 磁盘存储
- 基本类型
boolean char byte short int long float double void
BigInteger
BingDecimal - 数组
基本类型数组
引用类型数组 - 作用域
- 创建新的数据类型: 类
成员变量和方法
成员变量默认值
“局部变量”没有默认值 - 方法,参数和返回值
参数列表 - import
- static
- 编译和运行
- 注释
@see等
第三章 操作符
- 操作符
+,-,*,/,== ,= - 优先级
- 赋值
引用赋值 - i++,++i
- == 比较的是对象的引用,覆盖equals
- &&,||是短路操作符
- 直接常量
十六进制:0x
八进制:0
float:F
long;L
指数计数:e - 按位操作符 & | ~ ^
- 移位操作符 >>, << ,>>> ,<<<
- 三元操作符 ?:
- 字符串操作符 + +=
- java中的位数溢出
第四章 控制执行流程
第五章 初始化与清理
- 构造器
- 重载
- 默认构造器
- this关键字
- 清理 finalize()
finalize的一个用法:回收对象前检查状态,抛出异常
常见垃圾回收机制
- 引用计数 - 缺陷:循环引用;
- "活对象查找存留" - 自适应“停止-复制” + “标记-清扫” + “分代”
从堆栈和静态存储区出发,遍历引用,找到存活的对象;
- 初始化
初始化顺序
1). 查找 .class文件
2). 加载.class(创建class对象),进行静态初始化
3). 用new创建对象时,在堆上为对象分配足够的空间
4). 将分配的空间清零,初始化成员变量为默认值
5). 初始化基类非静态部分
6). 按照申明顺序初始化成员变量
7). 非静态代码块
8). 构造器
第六章 访问权限控制
第七章 复用类
- 方式:组合,继承
- final关键字的作用
第八章 多态
- 后期绑定
- 用多态进行程序设计
第九章 接口
- 接口多实现(同名方法)
- 策略模式
- 嵌套接口
第十章 内部类
- 内部类持有外部类引用
- .this和.new
- 静态内部类->嵌套类
- 为什么需要内部类
多继承
语法上没有is-a的歧义 - 闭包
闭包是一个可调用的对象,记录类创建它的作用域的一些信息。
内部类是面向对象的闭包。 - 内部类的继承
导出类的构造器携带参数外部类enclosingClassReference
必须在导出类构造器中调用enclosingClassReference.super()
第十一章 持有对象
- Collection,Map
- ArrayList,LinkedList
- TreeSet(红黑树),HashSet(散列),LinkedHashSet(散列+链表)
- TreeMap,HashMap,LinkedHashMap
- Stack,Queue,PriorityQueue
第十二章 异常处理
- 将“描述正常执行过程中做什么事”和“发生问题怎么办”的代码隔离开。
- try-catch-finally
- 编译时异常,Error,RuntimeException
- 异常链,嵌套异常
- 覆写方法时候,只能抛出基类方法申明的异常
- 构造器中发生异常,finally不一定起作用
第十三章 字符串
- String是不可变的对象
- +低效的原因:创建多个StringBuilder
- StringBuilder(非线程安全),StringBuffer(线程安全)
- Formatter
- 正则表达式
java正则表达式的转义使用\
,特殊字符表示也使用\
,例如:
通常,
\d
表示数字,正则中\\d
匹配一位数字
通常,\\
表示\
,正则中\\\\
匹配反斜线\
正则中换行\n\t
不需要两个反斜线
(-|\\+)?
表示以一个加号或者减号开头
量词
贪婪型 所有量词
非贪婪型 量词后加问号
占有型(java特有) 量词后加加号
如
贪婪型 | 贪婪 | 占有 |
---|---|---|
X? | X?? | X?+ |
X* | X*? | X*+ |
X+ | X+? | X++ |
X通常需要用圆括号扩起来
第十四章 类型信息
- RTTI:Run-Time Type Information
- Class对象
- 类加载器
- instance of
- 反射
- 动态代理 InvocatoinHandler
第十五章 泛型
- 定义泛型类,泛型方法
- 泛型擦除
- 在泛型代码内部,无法获得任何有关泛型参数类型的信息
- 泛型类型只在静态类型检查期间出现,之后被替换为非泛型上界
- 不能是实例化具有参数类型的数组
- 不能协变
- 通配符 <? extend T>
- 超类型通配符 <? super T>
- 无界通配符 <?>
- 指定上界(extend T)不能set->T;指定下界,get->obj
- 自限定类型
Class SelfB<T extends SelfB<T>>
第十六章 数组
- 多维数组
- Arrays常用方法:
deepEquals()
,sort()
,binarySearch()
,fill()
其他
System.arraycopy()
第十七章 容器深入研究
- Collection/Map常用方法
- 数据结构
容器 | 原理 | 特点 |
---|---|---|
HashMap |
散列表 | 无序,查找快 |
LinkedHashMap |
散列,链表 | 有序( 插入/LRU),迭代快 |
TreeMap |
红黑树 | 有序(指定顺序) |
- 散列码和散列函数
计算散列码,散列码将被映射为下标(受容量和负载因子影响),Entry作为value,保存到数组中;为了解决散列冲突,数组中保存list(拉链法) - 生成有意义的
hashCode
- 负载因子 =
size()
/容量 - 持有引用
SoftRefenence
,WeakRefenence
,PhantomRefenence
第十八章 I/O系统
第十九章 枚举类型
- 定义枚举
- 枚举实际都继承自
java.lang.Enum
-
values()
方法是由编译器添加的静态方法 - 嵌套枚举
-
EnumSet
,EnumMap
-
Enum
内定义抽象方法,由具体枚举实现 - 多路分发
第二十章 注解
- 定义注解
- 元注解
-
Target
: 作用域 -
Retention
: 生命周期 -
Documented
: 注解包含在javadoc中 -
Inherited
: 允许子类继承父类的注解
- 编写注解处理器
第二十一章 并发
- “效率”,“阻塞”
- 定义Tread
- 共享资源
所有对象自动含有单一的锁
sychronized
lock
volatile - 生命周期
新建,就绪,阻塞,死亡 - 进入阻塞状态
- sleep
- wait
- 阻塞式方法(io)
- 等待锁