Java 编程思想 Thinking in Java 第4版 PDF 文档
同人类任何语言一样,Java 为我们提供了一种表达思想的方式。如操作得当,同其他方式相比,随着问题变得愈大和愈复杂,这种表达方式的方便性和灵活性会显露无遗。
不可将 Java 简单想象成一系列特性的集合;如孤立地看,有些特性是没有任何意义的。只有在考虑设计、而非考虑简单的编码时,才可真正体会到 Java 的强大。为了按这种方式理解 Java,首先必须掌握它与编程的一些基本概念。本书讨论了编程问题、它们为何会成为问题以及 Java 用以解决它们的方法。所以,我对每一章的解释都建立在如何用语言解决一种特定类型的问题基础上。按这种方式,我希望引导您一步一步地进入 Java 的世界,使其最终成为您最自然的一种语言。
贯穿本书,我试图在您的大脑里建立一个模型——或者说一个知识结构。这样可加深对语言的理解。若遇到难解之处,应学会把它填入这个模型的对应地方,然后自行演绎出答案。事实上,学习任何语言时,脑海里有一个现成的知识结构往往会起到事半功倍的效果。
在线阅读:https://www.wenjiangs.com/docs/thinking-in-java
目录
第 1 章 对象入门
1.1 抽象的进步
1.2 对象的接口
1.3 实现方案的隐藏
1.4 方案的重复使用
1.5 继承:重新使用接口
1.5.1 改善基础类
1.5.2 等价与类似关系
1.6 多形对象的互换使用
1.6.1 动态绑定
1.6.2 抽象的基础类和接口
1.7 对象的创建和存在时间
1.7.1 集合与继承器
1.7.2 单根结构
1.7.3 集合库与方便使用集合
1.7.4 清除时的困境:由谁负责清除?
1.8 违例控制:解决错误
1.9 多线程
1.10 永久性
1.11 Java 和因特网
1.11.1 什么是 Web?
1.11.2 客户端编程
1.11.3 服务器端编程
1.11.4 一个独立的领域:应用程序
1.12 分析和设计
1.12.1 不要迷失
1.12.2 阶段 0:拟出一个计划
1.12.3 阶段 1:要制作什么?
1.12.4 阶段 2:如何构建?
1.12.5 阶段 3:开始创建
1.12.6 阶段 4:校订
1.12.7 计划的回报
1.13 Java 还是 C++?
第 2 章 一切都是对象
2.1 用句柄操纵对象
2.2 所有对象都必须创建
2.2.1 保存到什么地方
2.2.2 特殊情况:主要类型
2.2.3 Java 的数组
2.3 绝对不要清除对象
2.3.1 作用域
2.3.2 对象的作用域
2.4 新建数据类型:类
2.4.1 字段和方法
2.5 方法、自变量和返回值
2.5.1 自变量列表
2.6 构建 Java 程序
2.6.1 名字的可见性
2.6.2 使用其他组件
2.6.3 static 关键字
2.7 我们的第一个 Java 程序
2.8 注释和嵌入文档
2.8.1 注释文档
2.8.2 具体语法
2.8.3 嵌入 HTML
2.8.4 @see:引用其他类
2.8.5 类文档标记
2.8.6 变量文档标记
2.8.7 方法文档标记
2.8.8 文档示例
2.9 编码样式
2.10 总结
2.11 练习
第 3 章 控制程序流程
3.1 使用 Java 运算符
3.1.1 优先级
3.1.2 赋值
3.1.3 算术运算符
3.1.4 自动递增和递减
3.1.5 关系运算符
3.1.6 逻辑运算符
3.1.7 按位运算符
3.1.8 移位运算符
3.1.9 三元 if-else 运算符
3.1.10 逗号运算符
3.1.11 字串运算符+
3.1.12 运算符常规操作规则
3.1.13 造型运算符
3.1.14 Java 没有“sizeof”
3.1.15 复习计算顺序
3.1.16 运算符总结
3.2 执行控制
3.2.1 真和假
3.2.2 if-else
3.2.3 反复
3.2.4 do-while
3.2.5 for
3.2.6 中断和继续
3.2.7 开关
3.3 总结
3.4 练习
第 4 章 初始化和清除
4.1 用构建器自动初始化
4.2 方法过载
4.2.1 区分过载方法
4.2.2 主类型的过载
4.2.3 返回值过载
4.2.4 默认构建器
4.2.5 this 关键字
4.3 清除:收尾和垃圾收集
4.3.1 finalize() 用途何在
4.3.2 必须执行清除
4.4 成员初始化
4.4.1 规定初始化
4.4.2 构建器初始化
4.5 数组初始化
4.5.1 多维数组
4.6 总结
4.7 练习
第 5 章 隐藏实施过程
5.1 包:库单元
5.1.1 创建独一无二的包名
5.1.2 自定义工具库
5.1.3 利用导入改变行为
5.1.4 包的停用
5.2 Java 访问指示符
5.2.1 “友好的”
5.2.2 public:接口访问
5.2.3 private:不能接触!
5.2.4 protected:“友好的一种”
5.3 接口与实现
5.4 类访问
5.5 总结
5.6 练习
第 6 章 类再生
6.1 合成的语法
6.2 继承的语法
6.2.1 初始化基础类
6.3 合成与继承的结合
6.3.1 确保正确的清除
6.3.2 名字的隐藏
6.4 到底选择合成还是继承
6.5 protected
6.6 累积开发
6.7 上溯造型
6.7.1 何谓“上溯造型”?
6.8 final 关键字
6.8.1 final 数据
6.8.2 final 方法
6.8.3 final 类
6.8.4 final 的注意事项
6.9 初始化和类装载
6.9.1 继承初始化
6.10 总结
6.11 练习
第 7 章 多形性
7.1 上溯造型
7.1.1 为什么要上溯造型
7.2 深入理解
7.2.1 方法调用的绑定
7.2.2 产生正确的行为
7.2.3 扩展性
7.3 覆盖与过载
7.4 抽象类和方法
7.5 接口
7.5.1 Java 的“多重继承”
7.5.2 通过继承扩展接口
7.5.3 常数分组
7.5.4 初始化接口中的字段
7.6 内部类
7.6.1 内部类和上溯造型
7.6.2 方法和作用域中的内部类
7.6.3 链接到外部类
7.6.4 static 内部类
7.6.5 引用外部类对象
7.6.6 从内部类继承
7.6.7 内部类可以覆盖吗?
7.6.8 内部类标识符
7.6.9 为什么要用内部类:控制框架
7.7 构建器和多形性
7.7.1 构建器的调用顺序
7.7.2 继承和 finalize()
7.7.3 构建器内部的多形性方法的行为
7.8 通过继承进行设计
7.8.1 纯继承与扩展
7.8.2 下溯造型与运行期类型标识
7.9 总结
7.10 练习
第 8 章 对象的容纳
8.1 数组
8.1.1 数组和第一类对象
8.1.2 数组的返回
8.2 集合
8.2.1 缺点:类型未知
8.3 枚举器(反复器)
8.4 集合的类型
8.4.1 Vector
8.4.2 BitSet
8.4.3 Stack
8.4.4 Hashtable
8.4.5 再论枚举器
8.5 排序
8.6 通用集合库
8.7 新集合
8.7.1 使用 Collections
8.7.2 使用 Lists
8.7.3 使用 Sets
8.7.4 使用 Maps
8.7.5 决定实施方案
8.7.6 未支持的操作
8.7.7 排序和搜索
8.7.8 实用工具
8.8 总结
8.9 练习
第 9 章 违例差错控制
9.1 基本违例
9.1.1 违例自变量
9.2 违例的捕获
9.2.1 try 块
9.2.2 违例控制器
9.2.3 违例规范
9.2.4 捕获所有违例
9.2.5 重新“掷”出违例
9.3 标准 Java 违例
9.3.1 RuntimeException 的特殊情况
9.4 创建自己的违例
9.5 违例的限制
9.6 用 finally 清除
9.6.1 用 finally 做什么
9.6.2 缺点:丢失的违例
9.7 构建器
9.8 违例匹配
9.8.1 违例准则
9.9 总结
9.10 练习
第 10 章 Java IO 系统
10.1 输入和输出
10.1.1 InputStream 的类型
10.1.2 OutputStream 的类型
10.2 增添属性和有用的接口
10.2.1 通过 FilterInputStream 从 InputStream 里读入数据
10.2.2 通过 FilterOutputStream 向 OutputStream 里写入数据
10.3 本身的缺陷:RandomAccessFile
10.4 File 类
10.4.1 目录列表器
10.4.2 检查与创建目录
10.5 IO 流的典型应用
10.5.1 输入流
10.5.2 输出流
10.5.3 快捷文件处理
10.5.4 从标准输入中读取数据
10.5.5 管道数据流
10.6 StreamTokenizer
10.6.1 StringTokenizer
10.7 Java 1.1 的 IO 流
10.7.1 数据的发起与接收
10.7.2 修改数据流的行为
10.7.3 未改变的类
10.7.4 一个例子
10.7.5 重导向标准 IO
10.8 压缩
10.8.1 用 GZIP 进行简单压缩
10.8.2 用 Zip 进行多文件保存
10.8.3 Java 归档(jar)实用程序
10.9 对象序列化
10.9.1 寻找类
10.9.2 序列化的控制
10.9.3 利用“持久性”
10.10 总结
10.11 练习
第 11 章 运行期类型鉴定
11.1 对 RTTI 的需要
11.1.1 Class 对象
11.1.2 造型前的检查
11.2 RTTI 语法
11.3 反射:运行期类信息
11.3.1 一个类方法提取器
11.4 总结
11.5 练习
第 12 章 传递和返回对象
12.1 传递句柄
12.1.1 别名问题
12.2 制作本地副本
12.2.1 按值传递
12.2.2 克隆对象
12.2.3 使类具有克隆能力
12.2.4 成功的克隆
12.2.5 Object.clone() 的效果
12.2.6 克隆合成对象
12.2.7 用 Vector 进行深层复制
12.2.8 通过序列化进行深层复制
12.2.9 使克隆具有更大的深度
12.2.10 为什么有这个奇怪的设计
12.3 克隆的控制
12.3.1 副本构建器
12.4 只读类
12.4.1 创建只读类
12.4.2 “一成不变”的弊端
12.4.3 不变字串
12.4.4 String 和 StringBuffer 类
12.4.5 字串的特殊性
12.5 总结
12.6 练习
第 13 章 创建窗口和程序片
13.1 为何要用 AWT?
13.2 基本程序片
13.2.1 程序片的测试
13.2.2 一个更图形化的例子
13.2.3 框架方法的演示
13.3 制作按钮
13.4 捕获事件
13.5 文本字段
13.6 文本区域
13.7 标签
13.8 复选框
13.9 单选钮
13.10 下拉列表
13.11 列表框
13.11.1 handleEvent()
13.12 布局的控制
13.12.1 FlowLayout
13.12.2 BorderLayout
13.12.3 GridLayout
13.12.4 CardLayout
13.12.5 GridBagLayout
13.13 action 的替代品
13.14 程序片的局限
13.14.1 程序片的优点
13.15 视窗化应用
13.15.1 菜单
13.15.2 对话框
13.16 新型 AWT
13.16.1 新的事件模型
13.16.2 事件和接收者类型
13.16.3 用 Java 1.1 AWT 制作窗口和程序片
13.16.4 再研究一下以前的例子
13.16.5 动态绑定事件
13.16.6 将事务逻辑与 UI 逻辑区分开
13.16.7 推荐编码方法
13.17 Java 1.1 用户接口 API
13.17.1 桌面颜色
13.17.2 打印
13.17.3 剪贴板
13.18 可视编程和 Beans
13.18.1 什么是 Bean
13.18.2 用 Introspector 提取 BeanInfo
13.18.3 一个更复杂的 Bean
13.18.4 Bean 的封装
13.18.5 更复杂的 Bean 支持
13.18.6 Bean 更多的知识
13.19 Swing 入门
13.19.1 Swing 有哪些优点
13.19.2 方便的转换
13.19.3 显示框架
13.19.4 工具提示
13.19.5 边框
13.19.6 按钮
13.19.7 按钮组
13.19.8 图标
13.19.9 菜单
13.19.10 弹出式菜单
13.19.11 列表框和组合框
13.19.12 滑杆和进度指示条
13.19.13 树
13.19.14 表格
13.19.15 卡片式对话框
13.19.16 Swing 消息框
13.19.17 Swing 更多的知识
13.20 总结
13.21 练习
第 14 章 多线程
14.1 反应灵敏的用户界面
14.1.1 从线程继承
14.1.2 针对用户界面的多线程
14.1.3 用主类合并线程
14.1.4 制作多个线程
14.1.5 Daemon 线程
14.2 共享有限的资源
14.2.1 资源访问的错误方法
14.2.2 Java 如何共享资源
14.2.3 回顾 Java Beans
14.3 堵塞
14.3.1 为何会堵塞
14.3.2 死锁
14.4 优先级
14.4.1 线程组
14.5 回顾 runnable
14.5.1 过多的线程
14.6 总结
14.7 练习
第 15 章 网络编程
15.1 机器的标识
15.1.1 服务器和客户机
15.1.2 端口:机器内独一无二的场所
15.2 套接字
15.2.1 一个简单的服务器和客户机程序
15.3 服务多个客户
15.4 数据报
15.5 一个 Web 应用
15.5.1 服务器应用
15.5.2 NameSender 程序片
15.5.3 要注意的问题
15.6 Java 与 CGI 的沟通
15.6.1 CGI 数据的编码
15.6.2 程序片
15.6.3 用 C++写的 CGI 程序
15.6.4 POST 的概念
15.7 用 JDBC 连接数据库
15.7.1 让示例运行起来
15.7.2 查找程序的 GUI 版本
15.7.3 JDBC API 为何如何复杂
15.8 远程方法
15.8.1 远程接口概念
15.8.2 远程接口的实施
15.8.3 创建根与干
15.8.4 使用远程对象
15.8.5 RMI 的替选方案
15.9 总结
15.10 练习
第 16 章 设计范式
16.1 范式的概念
16.1.1 单子
16.1.2 范式分类
16.2 观察器范式
16.3 模拟垃圾回收站
16.4 改进设计
16.4.1 “制作更多的对象”
16.4.2 用于原型创建的一个范式
16.5 抽象的应用
16.6 多重派遣
16.6.1 实现双重派遣
16.7 访问器范式
16.8 RTTI 真的有害吗
16.9 总结
16.10 练习
第 17 章 项目
17.1 文字处理
17.1.1 提取代码列表
17.1.2 检查大小写样式
17.2 方法查找工具
17.3 复杂性理论
17.4 总结
17.5 练习
附录 A 使用非 JAVA 代码
A.1 Java 固有接口
A.1.1 调用固有方法
A.1.2 访问 JNI 函数:JNIEnv 自变量
A.1.3 传递和使用 Java 对象
A.1.4 JNI 和 Java 异常
A.1.5 JNI 和线程处理
A.1.6 使用现成代码
A.2 微软的解决方案
A.3 J/Direct
A.3.1 @dll.import 引导命令
A.3.2 com.ms.win32 包
A.3.3 汇集
A.3.4 编写回调函数
A.3.5 其他 J/Direct 特性
A.4 本原接口(RNI)
A.4.1 RNI 总结
A.5 Java/COM 集成
A.5.1 COM 基础
A.5.2 MS Java/COM 集成
A.5.3 用 Java 设计 COM 服务器
A.5.4 用 Java 设计 COM 客户
A.5.5 ActiveX/Beans 集成
A.5.6 固有方法与程序片的注意事项
A.6 CORBA
A.6.1 CORBA 基础
A.6.2 一个例子
A.6.3 Java 程序片和 CORBA
A.6.4 比较 CORBA 与 RMI
A.7 总结
附录 B 对比 C++和 Java
附录 C Java 编程规则
附录 D 性能
D.1 基本方法
D.2 寻找瓶颈
D.2.1 安插自己的测试代码
D.2.2 JDK 性能评测[2]
D.2.3 特殊工具
D.2.4 性能评测的技巧
D.3 提速方法
D.3.1 常规手段
D.3.2 依赖语言的方法
D.3.3 特殊情况
D.4 参考资源
D.4.1 性能工具
D.4.2 Web 站点
D.4.3 文章
D.4.4 Java 专业书籍
D.4.5 一般书籍
附录 E 关于垃圾收集的一些话
附录 F 推荐读物
下载地址:https://www.wenjiangs.com/wp-content/uploads/2023/10/LBNHSOQlPePvfW4o.zip
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
你可能也喜欢
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论