第1章 Java语言概述与开发环境1 1.1 Java语言的发展简史2 1.2 Java程序运行机制4 1.2.1 **语言的运行机制4 1.2.2 Java程序的运行机制和JVM5 1.3 开发Java的准备6 1.3.1 下载和安装Java 11的JDK6 不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢?7 1.3.2 设置PATH环境变量9 为什么选择用户变量?用户变量与系统变量有什么区别?10 1.4 **个Java程序10 1.4.1 编辑Java源代码10 1.4.2 编译Java程序11 当编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢?11 1.4.3 运行Java程序12 1.4.4 根据CLASSPATH环境变量定位类13 1.5 Java程序的基本规则14 1.5.1 Java程序的组��形式14 1.5.2 Java源文件的命名规则14 1.5.3 初学者容易犯的错误15 1.6 交互式工具:jshell17 1.7 Java 11改进的垃圾回收器18 1.8 何时开始使用IDE工具20 我想学习Java编程,到底是学习Eclipse好,还是学习IntelliJ IDEA好呢?21 1.9 本章小结22 本章练习22 第2章 理解面向对象23 2.1 面向对象24 2.1.1 结构化程序设计简介24 2.1.2 程序的三种基本结构25 2.1.3 面向对象程序设计简介27 2.1.4 面向对象的基本特征28 2.2 UML(统一建模语言)介绍29 2.2.1 用例图31 2.2.2 类图31 2.2.3 组件图33 2.2.4 部署图34 2.2.5 顺序图34 2.2.6 活动图35 2.2.7 状态机图36 2.3 Java的面向对象特征37 2.3.1 一切都是对象37 2.3.2 类和对象37 2.4 本章小结38 第3章 数据类型和运算符39 3.1 注释40 3.1.1 单行注释和多行注释40 3.1.2 文档注释41 API文档是什么?41 为什么要学习查看API文档的方法?43 3.2 标识符和关键字47 3.2.1 分隔符47 3.2.2 标识符规则49 3.2.3 Java关键字49 3.3 数据类型分类50 什么是变量?变量有什么用?50 3.4 基本数据类型51 3.4.1 整型51 3.4.2 字符型53 什么是字符集?53 3.4.3 浮点型54 3.4.4 数值中使用下画线分隔56 3.4.5 布尔型56 3.4.6 使用var定义变量57 3.5 基本类型的类型转换58 3.5.1 自动类型转换58 3.5.2 强制类型转换59 3.5.3 表达式类型的自动提升61 3.6 直接量62 3.6.1 直接量的类型62 3.6.2 直接量的赋值62 3.7 运算符63 3.7.1 算术运算符63 3.7.2 赋值运算符66 3.7.3 位运算符66 3.7.4 扩展后的赋值运算符68 3.7.5 比较运算符69 3.7.6 逻辑运算符70 3.7.7 三目运算符71 3.7.8 运算符的结合性和优先级72 3.8 本章小结73 本章练习73 第4章 流程控制与数组74 4.1 顺序结构75 4.2 分支结构75 4.2.1 if条件语句75 4.2.2 Java 11改进的switch分支语句79 4.3 循环结构81 4.3.1 while循环语句81 4.3.2 do while循环语句82 4.3.3 for循环83 4.3.4 嵌套循环86 4.4 控制循环结构87 4.4.1 使用break结束循环87 4.4.2 使用continue忽略本次循环剩下语句88 4.4.3 使用return结束方法89 4.5 数组类型90 4.5.1 理解数组:数组也是一种类型90 int[]是一种类型吗?怎么使用这种类型呢?90 4.5.2 定义数组90 4.5.3 数组的初始化91 能不能只分配内存空间,不赋初始值呢?91 4.5.4 使用数组93 为什么要我记住这些异常信息?93 4.5.5 foreach循环94 4.6 深入数组95 4.6.1 内存中的数组95 为什么有栈内存和堆内存之分?96 4.6.2 基本类型数组的初始化97 4.6.3 引用类型数组的初始化98 4.6.4 没有多维数组100 我是否可以让图4.13中灰色覆盖的数组元素再次指向另一个数组?这样不就可以扩展成三维数组,甚至扩展成更多维的数组吗?102 4.6.5 操作数组的工具类:Arrays103 4.6.6 数组应用举例106 4.7 本章小结109 本章练习109 第5章 面向对象(上)110 5.1 类和对象111 5.1.1 定义类111 构造器不是没有返回值吗?为什么不能用void声明呢?113 5.1.2 对象的产生和使用114 5.1.3 对象、引用和指针114 5.1.4 对象的this引用116 5.2 方法详解119 5.2.1 方法的所属性119 5.2.2 方法的参数传递机制120 5.2.3 形参个数可变的方法124 5.2.4 递归方法125 5.2.5 方法重载126 为什么方法的返回值类型不能用于区分重载的方法?127 5.3 成员变量和局部变量127 5.3.1 成员变量和局部变量128 5.3.2 成员变量的初始化和内存中的运行机制131 5.3.3 局部变量的初始化和内存中的运行机制133 5.3.4 变量的使用规则133 5.4 隐藏和封装134 5.4.1 理解封装134 5.4.2 使用访问控制符135 5.4.3 package、import和import static138 5.4.4 Java的常用包142 5.5 深入构造器142 5.5.1 使用构造器执行初始化142 构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象?143 5.5.2 构造器重载144 为什么要用this来调用另一个重载的构造器?我把另一个构造器里的代码复制、粘贴到这个构造器里不就可以了吗?145 5.6 类的继承145 5.6.1 继承的特点145 5.6.2 重写父类的方法147 5.6.3 super限定148 5.6.4 调用父类构造器150 为什么我创建Java对象时从未感觉到java.lang. Object类的构造器被调用过?152 5.7 多态152 5.7.1 多态性153 5.7.2 引用变量的强制类型转换154 5.7.3 instanceof运算符156 5.8 继承与组合156 5.8.1 使用继承的注意点157 5.8.2 利用组合实现复用158 使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大?160 5.9 初始化块161 5.9.1 使用初始化块161 5.9.2 实例初始化块和构造器163 5.9.3 类初始化块163 5.10 本章小结166 本章练习166 第6章 面向对象(下)167 6.1 包装类168 Java为什么要对这些数据进行缓存呢?171 6.2 处理对象172 6.2.1 打印对象和toString方法172 6.2.2 ==和equals方法174 上面程序中判断obj是否为Person类的实例时,为何不用obj instanceof Person来判断呢?177 6.3 类成员177 6.3.1 理解类成员177 6.3.2 单例(Singleton)类178 6.4 final修饰符179 6.4.1 final成员变量180 6.4.2 final局部变量182 6.4.3 final修饰基本类型变量和引用类型变量的区别182 6.4.4 可执行“宏替换”的final变量183 6.4.5 final方法185 6.4.6 final类186 6.4.7 不可变类186 6.4.8 缓存实例的不可变类189 6.5 抽象类191 6.5.1 抽象方法和抽象类191 6.5.2 抽象类的作用194 6.6 Java 9改进的接口195 6.6.1 接口的概念195 6.6.2 Java 9中接口的定义196 6.6.3 接口的继承198 6.6.4 使用接口199 6.6.5 接口和抽象类201 6.6.6 面向接口编程201 6.7 内部类205 6.7.1 非静态内部类205 学生提问:非静态内部类对象和外部类对象的关系是怎样的?208 6.7.2 静态内部类209 为什么静态内部类的实例方法也不能访问外部类的实例属性呢?210 学生提问:接口里是否能定义内部接口?211 6.7.3 使用内部类211 既然内部类是外部类的成员,那么是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类呢?213 6.7.4 局部内部类213 6.7.5 匿名内部类214 6.8 Java 11增强的Lambda表达式217 6.8.1 Lambda表达式入门217 6.8.2 Lambda表达式与函数式接口219 6.8.3 在Lambda表达式中使用var221 6.8.4 方法引用与构造器引用222 6.8.5 Lambda表达式与匿名内部类的联系和区别225 6.8.6 使用Lambda表达式调用Arrays的类方法226 6.9 枚举类226 6.9.1 手动实现枚举类227 6.9.2 枚举类入门227 6.9.3 枚举类的成员变量、方法和构造器229 6.9.4 实现接口的枚举类231 枚举类不是用final修饰了吗?怎么还能派生子类呢?232 6.9.5 包含抽象方法的枚举类232 6.10 对象与垃圾回收233 6.10.1 对象在内存中的状态233 6.10.2 强制垃圾回收234 6.10.3 finalize方法235 6.10.4 对象的软、弱和虚引用236 6.11 修饰符的适用范围240 6.12 多版本JAR包240 6.12.1 jar命令详解241 6.12.2 创建可执行的JAR包244 6.12.3 关于JAR包的技巧244 6.13 本章小结245 本章练习245 第7章 Java基础类库246 7.1 与用户互动247 7.1.1 运行Java程序的参数247 7.1.2 使用Scanner获取键盘输入248 7.2 系统相关250 7.2.1 System类250 7.2.2 Runtime类与Java 9的ProcessHandle252 7.3 常用类253 7.3.1 Object类253 7.3.2 操作对象的Objects工具类255 7.3.3 Java 9改进的String、StringBuffer和StringBuilder类256 7.3.4 Math类259 7.3.5 ThreadLocalRandom与Random261 7.3.6 BigDecimal类262 7.4 Java 8的日期、时间类265 7.4.1 Date类265 7.4.2 Calendar类266 7.4.3 新的日期、时间包269 7.5 正则表达式271 7.5.1 创建正则表达式271 7.5.2 使用正则表达式274 7.6 变量处理和方法处理277 7.6.1