《On Java 中文版 基础卷》是由人民邮电出版社出版的一本关于Java基础方面的书籍,作者是布鲁斯·埃克尔(Bruce、Eckel),主要介绍了关于Java方面的知识内容,目前在Java基础类书籍综合评分为:9.4分。
书籍介绍
java编程开发语言程序设计核心技术教程书籍,Thinkingin作者BruceEckel重讲Java的编程思想,基于Java81117,配套视频讲解与导读指南!
编辑推荐
基于Java8、11、17,Thinkingin系列书籍作者BruceEckel重讲Java的编程思想!
1.查漏宝典:涵盖Java关键特性的设计原理和应用方法
2.避坑指南:以产业实践的得失为鉴,指明Java开发者不可不知的设计陷阱
3.小白大神皆可读:适合不同层次的Java开发者反复翻阅
4.大咖领读:3位一线技术专家带你拆解书中难点内容,总结Java开发精要
内容简介
本书是布鲁斯埃克尔时隔15年,继ThinkinginJava之后又一力作,基于Java的3个长期支持版(Java8、11、17),讲解Java核心语法,并对Java的核心变化进行详述。全书内容通俗易懂,配合示例讲解逐步深入,并结合实际开发需要,从语言底层设计出发,有效帮读者规避一些常见的开发陷阱。
主体部分共22章,内容包含对象、操作符、控制流、初始化和清理、复用、多态、接口、内部类、集合、函数式编程、流、异常、代码校验、文件、字符串、泛型等。
本书适合各个层次的Java开发者阅读,同时也可作为面向对象程序设计语言以及Java语言的参考教材。
目录
- 第1章什么是对象/001
- 1.1抽象的历程/002
- 1.2对象具有接口/003
- 1.3对象可以提供服务/005
- 1.4隐藏的实现/006
- 1.5复用实现/008
- 1.6继承/008
- is-a关系与is-like-a关系/012
- 1.7多态/013
- 1.8单根层次结构/016
- 1.9集合/017
- 参数化类型(泛型)/018
- 1.10对象的创建和生命周期/019
- 1.11异常处理/021
- 1.12总结/022
- 第2章安装Java和本书示例/023
- 2.1编辑器/023
- 2.2shell/024
- 2.2.1运行shell/024
- 2.2.2目录(文件夹)/025
- 2.2.3shell基础操作/025
- 2.3安装Java/026
- 2.4确认安装成功/027
- 2.5安装和运行本书示例/028
- Gradle基础任务/028
- 第3章对象无处不在/029
- 3.1通过引用操作对象/030
- 3.2必须创建所有对象/031
- 3.2.1数据保存在哪里/031
- 3.2.2特殊情况:基本类型/032
- 3.2.3Java中的数组/034
- 3.3注释/034
- 3.4无须销毁对象/035
- 3.4.1作用域/035
- 3.4.2对象的作用域/036
- 3.5使用class关键字创建新类型/037
- 字段/037
- 3.6方法、参数以及返回值/039
- 参数列表/039
- 3.7编写Java程序/041
- 3.7.1名称可见性/041
- 3.7.2使用其他组件/042
- 3.7.3static关键字/043
- 3.8你的第一个Java程序/045
- 编译和运行/047
- 3.9编程风格/048
- 3.10总结/049
- 第4章操作符/050
- 4.1使用Java操作符/050
- 4.2优先级/051
- 4.3赋值/051
- 方法调用中的别名/053
- 4.4算术操作符/054
- 一元加操作符和一元减操作符/055
- 4.5自动递增和自动递减/056
- 4.6关系操作符/057
- 测试对象是否相等/057
- 4.7逻辑操作符/061
- 短路/062
- 4.8字面量/063
- 4.8.1字面量里的下划线/065
- 4.8.2科学记数法(又称“指数
- 记数法”)/066
- 4.9按位操作符/067
- 4.10移位操作符/067
- 4.11三元操作符/071
- 4.12字符串操作符和=/072
- 4.13使用操作符时常犯的错误/073
- 4.14类型转换操作符/074
- 4.14.1截尾和舍入/075
- 4.14.2提升/076
- 4.15Java没有sizeof()/076
- 4.16操作符小结/076
- 4.17总结/081
- 第5章控制流/082
- 5.1true和false/082
- 5.2if-else/083
- 5.3迭代语句/084
- 5.3.1do-while/085
- 5.3.2for/085
- 5.3.3逗号操作符/086
- 5.4for-in语法/087
- 5.5return/089
- 5.6break和continue/090
- 5.7臭名昭著的goto/091
- 5.8switch/095
- 5.9字符串作为选择器/096
- 5.10总结/098
- 第6章初始化和清理/099
- 6.1用构造器保证初始化/100
- 6.2方法重载/102
- 6.2.1区分重载的方法/103
- 6.2.2使用基本类型的重载/104
- 6.2.3通过返回值区分重载方法/107
- 6.3无参构造器/108
- 6.4this关键字/109
- 6.4.1在构造器中调用构造器/111
- 6.4.2static的含义/112
- 6.5清理:终结和垃圾收集/113
- 6.5.1finalize()的作用/114
- 6.5.2你必须执行清理/115
- 6.5.3终止条件/115
- 6.5.4垃圾收集器的工作原理/117
- 6.6成员初始化/120
- 指定初始化/121
- 6.7构造器初始化/122
- 6.7.1初始化顺序/123
- 6.7.2静态数据的初始化/124
- 6.7.3显式的静态初始化/126
- 6.7.4非静态实例初始化/127
- 6.8数组初始化/128
- 6.8.1动态数组创建/129
- 6.8.2可变参数列表/132
- 6.9枚举类型/136
- 6.10新特性:局部变量类型
- 推断/138
- 6.11总结/140
- 第7章实现隐藏/141
- 7.1package:库单元/142
- 7.1.1代码组织/144
- 7.1.2创建独一无二的包名/145
- 7.1.3定制工具库/148
- 7.1.4用import来改变行为/149
- 7.1.5关于包的忠告/150
- 7.2Java访问权限修饰符/150
- 7.2.1包访问/150
- 7.2.2public:接口访问权限/151
- 7.2.3private:你无法访问它/153
- 7.2.4protected:继承访问权限/154
- 7.2.5包访问权限与公共构造器/155
- 7.3接口和实现/156
- 7.4类的访问权限/157
- 7.5新特性:模块/160
- 7.6总结/162
- 第8章复用/164
- 8.1组合语法/165
- 8.2继承语法/167
- 初始化基类/169
- 8.3委托/171
- 8.4组合与继承相结合/173
- 8.4.1确保正确的清理/175
- 8.4.2名称隐藏/177
- 8.5选择组合还是继承/178
- 8.6protected关键字/180
- 8.7向上转型/181
- 再论组合与继承/182
- 8.8final关键字/182
- 8.8.1final数据/183
- 8.8.2final方法/186
- 8.8.3final类/188
- 8.8.4关于final的忠告/189
- 8.9初始化及类的加载/190
- 继承与初始化/190
- 8.10总结/191
- 第9章多态/193
- 9.1再论向上转型/194
- 忘记对象类型/195
- 9.2难点/196
- 9.2.1方法调用绑定/197
- 9.2.2产生正确的行为/197
- 9.2.3可扩展性/201
- 9.2.4陷阱:“重写”private
- 方法/203
- 9.2.5陷阱:字段与静态方法/205
- 9.3构造器和多态/206
- 9.3.1构造器的调用顺序/206
- 9.3.2继承与清理/208
- 9.3.3构造器内部的多态方法
- 行为/213
- 9.4协变返回类型/215
- 9.5用继承进行设计/216
- 9.5.1替换与扩展/217
- 9.5.2向下转型与反射/218
- 9.6总结/220
- 第10章接口/221
- 10.1抽象类和抽象方法/221
- 10.2接口定义/226
- 10.2.1默认方法/228
- 10.2.2多重继承/230
- 10.2.3接口中的静态方法/233
- 10.2.4作为接口的Instrument/234
- 10.3抽象类与接口/236
- 10.4完全解耦/237
- 10.5组合多个接口/242
- 10.6通过继承来扩展接口/244
- 组合接口时的名称冲突/245
- 10.7适配接口/246
- 10.8接口中的字段/249
- 初始化接口中的字段/249
- 10.9嵌套接口/250
- 10.10接口和工厂/252
- 10.11新特性:接口的private
- 方法/255
- 10.12新特性:密封类和密封
- 接口/256
- 10.13总结/259
- 第11章内部类/260
- 11.1创建内部类/261
- 11.2到外部类的链接/262
- 11.3使用.this和.new/264
- 11.4内部类和向上转型/266
- 11.5在方法和作用域中的内部类/267
- 11.6匿名内部类/269
- 11.7嵌套类/273
- 11.7.1接口中的类/274
- 11.7.2从多层嵌套的内部类中
- 访问外部成员/275
- 11.8为什么需要内部类/276
- 11.8.1闭包与回调/278
- 11.8.2内部类与控制框架/281
- 11.9继承内部类/287
- 11.10内部类可以被重写吗/287
- 11.11局部内部类/289
- 11.12内部类标识符/291
- 11.13总结/291
- 第12章集合/292
- 12.1泛型和类型安全的集合/293
- 新特性:类型推断和泛型/296
- 12.2基本概念/297
- 12.3添加一组元素/298
- 12.4打印集合/300
- 12.5List/302
- 12.6Iterator/306
- ListIterator/309
- 12.7LinkedList/310
- 12.8Stack/312
- 12.9Set/314
- 12.10Map/318
- 12.11新特性:记录(record)
- 类型/321
- 12.12Queue/325
- PriorityQueue/327
- 12.13Collection和Iterator的
- 对比/328
- 12.14for-in和迭代器/332
- 适配器方法惯用法/334
- 12.15总结/338
- 第13章函数式编程/342
- 13.1旧方式与新方式/344
- 13.2lambda表达式/346
- 递归/348
- 13.3方法引用/349
- 13.3.1Runnable/350
- 13.3.2未绑定方法引用/351
- 13.3.3构造器方法引用/353
- 13.4函数式接口/354
- 13.4.1带有更多参数的函数式
- 接口/361
- 13.4.2解决缺乏基本类型函数
- 式接口的问题/361
- 13.5高阶函数/363
- 13.6闭包/364
- 内部类作为闭包/369
- 13.7函数组合/370
- 13.8柯里化和部分求值/372
- 13.9纯函数式编程/373
- 13.10总结/374
- 第14章流/375
- 14.1Java8对流的支持/377
- 14.2流的创建/378
- 14.2.1随机数流/379
- 14.2.2int类型的区间范围/382
- 14.2.3generate()/383
- 14.2.4iterate()/385
- 14.2.5流生成器/385
- 14.2.6Arrays/386
- 14.2.7正则表达式/387
- 14.3中间操作/388
- 14.3.1跟踪与调试/389
- 14.3.2对流元素进行排序/389
- 14.3.3移除元素/390
- 14.3.4将函数应用于每个流
- 元素/390
- 14.3.5在应用map()期间组
- 合流/392
- 14.4Optional类型/395
- 14.4.1便捷函数/397
- 14.4.2创建Optional/399
- 14.4.3Optional对象上的操作/400
- 14.4.4由Optional组成的流/404
- 14.5终结操作/405
- 14.5.1将流转换为一个数组/405
- 14.5.2在每个流元素上应用某个终结操作/406
- 14.5.3收集操作/407
- 14.5.4组合所有的流元素/410
- 14.5.5匹配/411
- 14.5.6选择一个元素/412
- 14.5.7获得流相关的信息/413
- 14.6小结/415
- 第15章异常/416
- 15.1概念/417
- 15.2基本的异常/418
- 异常参数/419
- 15.3捕捉异常/420
- 15.3.1try块/420
- 15.3.2异常处理程序/420
- 15.4创建自己的异常/421
- 异常与日志记录/424
- 15.5异常说明/427
- 15.6捕捉任何异常/428
- 15.6.1多重捕捉/430
- 15.6.2栈轨迹/431
- 15.6.3重新抛出异常/432
- 15.6.4异常链/436
- 15.7标准Java异常/439
- 特例:RuntimeException/440
- 15.8新特性:更好的NullPointerException
- 报告机制/441
- 15.9使用finally执行清理/443
- 15.9.1finally是干什么用的/444
- 15.9.2在return期间使用
- finally/446
- 15.9.3缺陷:异常丢失/447
- 15.10异常的约束/449
- 15.11构造器/452
- 15.12try-with-resources语句/456
- 15.12.1细节揭秘/459
- 15.12.2新特性:try-with-resources中的实际
- 上的终变量/463
- 15.13异常匹配/464
- 15.14其他可选方式/465
- 15.14.1历史/466
- 15.14.2观点/468
- 15.14.3把异常传递到控制台/470
- 15.14.4将“检查型异常”转换为
- “非检查型异常”/470
- 15.15异常使用指南/473
- 15.16小结/473
- 附记异常的奇异世界/474
- 第16章代码校验/476
- 16.1测试/476
- 16.1.1单元测试/477
- 16.1.2测试覆盖率的幻觉/481
- 16.2前置条件/482
- 16.2.1断言/482
- 16.2.2DbC单元测试/488
- 16.2.3使用Guava里的前置
- 条件/495
- 16.3测试驱动开发/498
- 测试驱动与测试优先/505
- 16.4日志/505
- 日志级别/507
- 16.5调试/508
- 16.5.1使用JDB进行调试/508
- 16.5.2图形调试器/511
- 16.6基准测试/511
- 16.6.1微基准测试/512
- 16.6.2介绍JMH/514
- 16.7分析与优化/520
- 优化指南/520
- 16.8样式检查/521
- 16.9静态错误分析/521
- 16.10代码审查/521
- 16.11结对编程/522
- 16.12重构/522
- 重构的基础/522
- 16.13持续集成/523
- 16.14总结/525
- 第17章文件/526
- 17.1文件和目录路径/527
- 17.1.1选择Path的片段/530
- 17.1.2分析Path/531
- 17.1.3添加或删除路径片段/532
- 17.2目录/533
- 17.3文件系统/537
- 17.4监听Path/538
- 17.5查找文件/541
- 17.6读写文件/543
- 17.7小结/546
- 第18章字符串/547
- 18.1不可变的字符串/547
- 18.2重载与StringBuilder/548
- 18.3无意识的递归/553
- 18.4对字符串的操作/555
- 18.5格式化输出/556
- 18.5.1printf()/556
- 18.5.2System.out.format()/557
- 18.5.3Formatter类/557
- 18.5.4格式说明符/558
- 18.5.5Formatter转换/560
- 18.5.6String.format()/562
- 18.6新特性:文本块/563
- 18.7正则表达式/565
- 18.7.1基础/566
- 18.7.2创建正则表达式/569
- 18.7.3量词/571
- 18.7.4Pattern和Matcher/572
- 18.7.5split()/580
- 18.7.6替换操作/580
- 18.7.7reset()/582
- 18.7.8正则表达式和Java
- I/O/583
- 18.8扫描输入/584
- 18.8.1Scanner分隔符/586
- 18.8.2使用正则表达式扫描/586
- 18.9StringTokenizer/587
- 18.10总结/588
- 第19章反射/589
- 19.1为什么需要反射/589
- 19.2Class对象/592
- 19.2.1类字面量/596
- 19.2.2泛型类的引用/598
- 19.2.3cast()方法/602
- 19.3转型前检查/603
- 19.3.1使用类字面量/609
- 19.3.2动态的instanceof/611
- 19.3.3递归计数/612
- 19.4注册工厂/614
- 19.5Instanceof与Class的
- 等价性/616
- 19.6运行时的类信息/618
- 类方法提取器/619
- 19.7动态代理/621
- 19.8使用Optional/625
- 19.8.1标签接口/630
- 19.8.2模拟对象和桩/633
- 19.9接口和类型信息/633
- 19.10总结/639
- 第20章泛型/641
- 20.1和C的对比/642
- 20.2简单泛型/643
- 20.2.1元组库/645
- 20.2.2栈类/648
- 20.2.3RandomList/649
- 20.3泛型接口/650
- 20.4泛型方法/653
- 20.4.1可变参数和泛型方法/654
- 20.4.2通用Supplier/655
- 20.4.3简化元组的使用/657
- 20.4.4Set实用工具/658
- 20.5构建复杂模型/663
- 20.6类型擦除的奥秘/665
- 20.6.1C的实现方法/667
- 20.6.2迁移的兼容性/669
- 20.6.3类型擦除存在的问题/670
- 20.6.4边界的行为/672
- 20.7对类型擦除的补偿/676
- 20.7.1创建类型实例/677
- 20.7.2泛型数组/680
- 20.8边界/686
- 20.9通配符/689
- 20.9.1编译器有多聪明?/692
- 20.9.2逆变性/694
- 20.9.3无界通配符/696
- 20.9.4捕获转换/705
- 20.10问题/707
- 20.10.1基本类型不可作为
- 类型参数/707
- 20.10.2实现参数化接口/709
- 20.10.3类型转换和警告/709
- 20.10.4重载/712
- 20.10.5基类会劫持接口/712
- 20.11自限定类型/714
- 20.11.1奇异递归泛型/714
- 20.11.2自限定/715
- 20.11.3参数协变性/718
- 20.12动态类型安全/721
- 20.13异常/722
- 20.14混型/724
- 20.14.1C中的混型/724
- 20.14.2与接口混合/726
- 20.14.3使用装饰器模式/727
- 20.14.4与动态代理混合/729
- 20.15潜在类型机制/730
- 20.15.1Python中的潜在类型
- 机制/731
- 20.15.2C中的潜在类型
- 机制/732
- 20.15.3Go中的潜在类型
- 机制/733
- 20.15.4Java中的直接潜在
- 类型机制/735
- 20.16对于缺少(直接的)潜在类型机制的补偿/736
- 20.16.1反射/736
- 20.16.2将方法应用于序列/737
- 20.17Java8中的辅助潜在类型
- 机制/741
- 使用Supplier的泛型方法/743
- 20.18总结:转型真的这么糟糕吗?/745
- 延伸阅读/747
- 第21章数组/748
- 21.1数组为何特殊/749
- 一个用于显示数组的常用工具
- 程序/751
- 21.2数组是一等对象/752
- 21.3返回数组/755
- 21.4多维数组/757
- 21.5数组和泛型/761
- 21.6Arrays.fill()/764
- 21.7Arrays.setAll()/765
- 21.8增量生成器/766
- 21.9随机数生成器/775
- 21.10泛型和基本类型数组/783
- 21.11修改已有的数组元素/787
- 21.12关于数组并行/788
- 21.12.1策略/789
- 21.12.2parallelSetAll()/789
- 21.13数组实用工具/790
- 21.14数组复制/791
- 21.15数组比较/794
- 21.16流和数组/795
- 21.17数组排序/796
- 21.17.1使用Arrays.sort()/800
- 21.17.2并行排序/801
- 21.18用Arrays.binarySearch()进行二分查找/802
- 21.19用parallelPrefix()进行累积计算/804
- 21.20总结/806
- 补充内容/809
- 积极看待C与Java的
- 遗产/810