Java 8编程官方参考教程 第九版
作者:(美)施密特(Schildt H.)著
出版时间:2015
内容简介
本书针对Java SE 8做了全面更新,介绍了如何开发、编译、调试和运行Java程序。畅销书作者Herbert Schildt撰写过众多经典的计算机编程图书。在本书中,他详尽地讲解了Java语言,包括Java的语法、关键字和基本编程原则,以及Java API库的主要内容。另外,本书还介绍了JavaBean、servlet、applet和Swing,并通过真实案例展示了Java语言的应用。本书对Java SE 8的新特性也进行了深入讲解,包括lambda表达式、流库和默认接口方法,书末介绍的JavaFX知识为深入学习打下了坚实基础。主要内容● 数据类型、变量、数组和运算符● 控制语句● 类、对象和方法● 方法重载和重写● 继承● 接口和包● 异常处理● 多线程编程● 枚举、自动装箱和注解● I/O类● 泛型● lambda表达式● 字符串处理● 集合框架● 联网● 事件处理● AWT和Swing● 并发API● 流API● 正则表达式● JavaFX● Java Bean● applet和servlet
目录
目 录 第Ⅰ部分 Java 语 言 第1章 Java的历史和演变 3 1.1 Java的家世 4 1.1.1 现代编程语言的诞生:C语言 4 1.1.2 C++:下一个阶段 5 1.1.3 Java出现的时机已经成熟 6 1.2 Java的诞生 6 1.3 Java改变Internet的方式 8 1.3.1 Java applet 8 1.3.2 安全性 8 1.3.3 可移植性 8 1.4 Java的魔力:字节码 9 1.5 servlet:服务器端的Java 10 1.6 Java的关键特性 10 1.6.1 简单性 10 1.6.2 面向对象 11 1.6.3 健壮性 11 1.6.4 多线程 11 1.6.5 体系结构中立 11 1.6.6 解释执行和高性能 12 1.6.7 分布式 12 1.6.8 动态性 12 1.7 Java的演变历程 12 1.8 Java SE 8 14 1.9 文化革新 15 第2章 Java综述 17 2.1 面向对象编程 17 2.1.1 两种范式 18 2.1.2 抽象 18 2.1.3 OOP三原则 19 2.2 第一个简单程序 23 2.2.1 输入程序 23 2.2.2 编译程序 23 2.2.3 深入分析第一个示例程序 24 2.3 第二个简短程序 26 2.4 两种控制语句 27 2.4.1 if语句 27 2.4.2 for循环 29 2.5 使用代码块 30 2.6 词汇问题 31 2.6.1 空白符 32 2.6.2 标识符 32 2.6.3 字面值 32 2.6.4 注释 32 2.6.5 分隔符 32 2.6.6 Java关键字 33 2.7 Java类库 34 第3章 数据类型、变量和数组 35 3.1 Java是强类型化的语言 35 3.2 基本类型 36 3.3 整型 36 3.3.1 byte 37 3.3.2 short 37 3.3.3 int 37 3.3.4 long 37 3.4 浮点型 38 3.4.1 float 38 3.4.2 double 39 3.5 字符型 39 3.6 布尔型 41 3.7 深入分析字面值 42 3.7.1 整型字面值 42 3.7.2 浮点型字面值 43 3.7.3 布尔型字面值 43 3.7.4 字符型字面值 43 3.7.5 字符串字面值 44 3.8 变量 45 3.8.1 变量的声明 45 3.8.2 动态初始化 45 3.8.3 变量的作用域和生存期 46 3.9 类型转换和强制类型转换 48 3.9.1 Java的自动类型转换 48 3.9.2 强制转换不兼容的类型 48 3.10 表达式中的自动类型提升 50 3.11 数组 51 3.11.1 一维数组 51 3.11.2 多维数组 54 3.11.3 另一种数组声明语法 58 3.12 关于字符串的一些说明 58 3.13 向C/C++程序员提供指针方面的说明 59 第4章 运算符 61 4.1 算术运算符 61 4.1.1 基本算术运算符 62 4.1.2 求模运算符 63 4.1.3 算术与赋值复合运算符 64 4.1.4 自增与自减运算符 65 4.2 位运算符 66 4.2.1 位逻辑运算符 67 4.2.2 左移 70 4.2.3 右移 71 4.2.4 无符号右移 72 4.2.5 位运算符与赋值的组合 74 4.3 关系运算符 74 4.4 布尔逻辑运算符 75 4.5 赋值运算符 77 4.6 “?”运算符 78 4.7 运算符的优先级 79 4.8 使用圆括号 80 第5章 控制语句 81 5.1 Java的选择语句 81 5.1.1 if语句 82 5.1.2 switch语句 84 5.2 迭代语句 89 5.2.1 while语句 89 5.2.2 do-while语句 91 5.2.3 for语句 93 5.2.4 for循环的for-each版本 97 5.2.5 嵌套的循环 102 5.3 跳转语句 103 5.3.1 使用break语句 103 5.3.2 使用continue语句 107 5.3.3 return语句 108 第6章 类 111 6.1 类的基础知识 112 6.1.1 类的一般形式 112 6.1.2 一个简单的类 113 6.2 声明对象 115 6.3 为对象引用变量赋值 117 6.4 方法 118 6.4.1 为Box类添加方法 118 6.4.2 返回值 120 6.4.3 添加带参数的方法 121 6.5 构造函数 123 6.6 this关键字 126 6.7 垃圾回收 127 6.8 finalize()方法 128 6.9 堆栈类 128 第7章 方法和类的深入分析 131 7.1 重载方法 131 7.2 将对象用作参数 136 7.3 参数传递的深入分析 139 7.4 返回对象 141 7.5 递归 142 7.6 访问控制 144 7.7 理解static 147 7.8 final介绍 149 7.9 重新审视数组 149 7.10 嵌套类和内部类 151 7.11 String类介绍 154 7.12 使用命令行参数 156 7.13 varargs:可变长度参数 157 7.13.1 重载varargs方法 160 7.13.2 varargs方法与模糊性 161 第8章 继承 165 8.1 继承的基础知识 165 8.1.1 成员访问与继承 167 8.1.2 一个更实际的例子 168 8.1.3 超类变量可以引用子类对象 170 8.2 使用super关键字 171 8.2.1 使用super调用超类的构造函数 171 8.2.2 super的另一种用法 175 8.3 创建多级继承层次 176 8.4 构造函数的调用时机 179 8.5 方法重写 180 8.6 动态方法调度 183 8.6.1 重写方法的目的 184 8.6.2 应用方法重写 185 8.7 使用抽象类 186 8.8 在继承中使用final关键字 189 8.8.1 使用final关键字阻止重写 189 8.8.2 使用final关键字阻止继承 190 8.9 Object类 190 第9章 包和接口 193 9.1 包 194 9.1.1 定义包 194 9.1.2 包查找与CLASSPATH 195 9.1.3 一个简短的包示例 195 9.2 访问保护 196 9.3 导入包 200 9.4 接口 202 9.4.1 定义接口 202 9.4.2 实现接口 203 9.4.3 嵌套接口 206 9.4.4 应用接口 207 9.4.5 接口中的变量 210 9.4.6 接口可以扩展 212 9.5 默认接口方法 213 9.5.1 默认方法的基础知识 214 9.5.2 一个更加实用的例子 215 9.5.3 多级继承的问题 216 9.6 在接口中使用静态方法 217 9.7 关于包和接口的最后说明 218 第10章 异常处理 219 10.1 异常处理的基础知识 219 10.2 异常类型 220 10.3 未捕获的异常 221 10.4 使用try和catch 222 10.5 多条catch子句 224 10.6 嵌套的try语句 225 10.7 throw 228 10.8 throws 229 10.9 finally 230 10.10 Java的内置异常 232 10.11 创建自己的异常子类 233 10.12 链式异常 235 10.13 3个近期添加的异常特性 237 10.14 使用异常 238 第11章 多线程编程 239 11.1 Java线程模型 240 11.1.1 线程优先级 241 11.1.2 同步 241 11.1.3 消息传递 242 11.1.4 Thread类和Runnable接口 242 11.2 主线程 243 11.3 创建线程 244 11.3.1 实现Runnable接口 245 11.3.2 扩展Thread类 247 11.3.3 选择一种创建方式 248 11.4 创建多个线程 248 11.5 使用isAlive()和join()方法 249 11.6 线程优先级 252 11.7 同步 253 11.7.1 使用同步方法 253 11.7.2 synchronized语句 255 11.8 线程间通信 257 11.9 挂起、恢复与停止线程 263 11.10 获取线程的状态 266 11.11 使用多线程 267 第12章 枚举、自动装箱与注解(元数据) 269 12.1 枚举 269 12.1.1 枚举的基础知识 270 12.1.2 values()和valueOf()方法 272 12.1.3 Java枚举是类类型 273 12.1.4 枚举继承自Enum类 275 12.1.5 另一个枚举示例 277 12.2 类型封装器 279 12.2.1 Character封装器 279 12.2.2 Boolean封装器 279 12.2.3 数值类型封装器 280 12.3 自动装箱 281 12.3.1 自动装箱与方法 281 12.3.2 表达式中发生的自动装箱/拆箱 282 12.3.3 布尔型和字符型数值的自动装箱/拆箱 284 12.3.4 自动装箱/拆箱有助于防止错误 285 12.3.5 一些警告 285 12.4 注解(元数据) 286 12.4.1 注解的基础知识 286 12.4.2 指定保留策略 287 12.4.3 在运行时使用反射获取注解 288 12.4.4 AnnotatedElement接口 293 12.4.5 使用默认值 293 12.4.6 标记注解 295 12.4.7 单成员注解 296 12.4.8 内置注解 297 12.5 类型注解 299 12.6 重复注解 303 第13章 I/O、applet以及其他主题 307 13.1 I/O的基础知识 308 13.1.1 流 308 13.1.2 字节流和字符流 308 13.1.3 预定义流 310 13.2 读取控制台输入 311 13.2.1 读取字符 311 13.2.2 读取字符串 312 13.3 向控制台写输出 314 13.4 PrintWriter类 314 13.5 读/写文件 315 13.6 自动关闭文件 321 13.7 applet的基础知识 325 13.8 transient和volatile修饰符 327 13.9 使用instanceof运算符 328 13.10 strictfp 330 13.11 本地方法 331 13.12 使用assert 334 13.13 静态导入 337 13.14 通过this()调用重载的构造函数 339 13.15 紧凑API配置文件 342 第14章 泛型 343 14.1 什么是泛型 344 14.2 一个简单的泛型示例 344 14.2.1 泛型只使用引用类型 348 14.2.2 基于不同类型参数的泛型类型是不同的 348 14.2.3 泛型提升类型安全性的原理 348 14.3 带两个类型参数的泛型类 350 14.4 泛型类的一般形式 352 14.5 有界类型 352 14.6 使用通配符参数 355 14.7 创建泛型方法 363 14.8 泛型接口 366 14.9 原始类型与遗留代码 368 14.10 泛型类层次 370 14.10.1 使用泛型超类 370 14.10.2 泛型子类 372 14.10.3 泛型层次中的运行时类型比较 374 14.10.4 强制转换 376 14.10.5 重写泛型类的方法 376 14.11 泛型的类型推断 378 14.12 擦除 379 14.13 模糊性错误 381 14.14 使用泛型的一些限制 382 14.14.1 不能实例化类型参数 382 14.14.2 对静态成员的一些限制 383 14.14.3 对泛型数组的一些限制 383 14.14.4 对泛型异常的限制 384 第15章 lambda表达式 385 15.1 lambda表达式简介 386 15.1.1 lambda表达式的基础知识 386 15.1.2 函数式接口 387 15.1.3 几个lambda表达式示例 388 15.2 块lambda表达式 391 15.3 泛型函数式接口 393 15.4 作为参数传递lambda表达式 395 15.5 lambda表达式与异常 398 15.6 lambda表达式和变量捕获 399 15.7 方法引用 400 15.7.1 静态方法的方法引用 400 15.7.2 实例方法的方法引用 401 15.7.3 泛型中的方法引用 405 15.8 构造函数引用 408 15.9 预定义的函数式接口 412 第Ⅱ部分 Java库 第16章 字符串处理 417 16.1 String类的构造函数 418 16.2 字符串的长度 420 16.3 特殊的字符串操作 420 16.3.1 字符串字面值 421 16.3.2 字符串连接 421 16.3.3 字符串和其他数据类型的连接 421 16.3.4 字符串转换和toString()方法 422 16.4 提取字符 423 16.4.1 charAt() 424 16.4.2 getChars() 424 16.4.3 getBytes() 424 16.4.4 toCharArray() 425 16.5 比较字符串 425 16.5.1 equals()和equalsIgnoreCase() 425 16.5.2 regionMatches() 426 16.5.3 startsWith()和endsWith() 426 16.5.4 equals()与== 427 16.5.5 compareTo() 427 16.6 查找字符串 429 16.7 修改字符串 430 16.7.1 substring() 430 16.7.2 concat() 431 16.7.3 replace() 432 16.7.4 trim() 432 16.8 使用valueOf()转换数据 433 16.9 改变字符串中字符的大小写 434 16.10 连接字符串 434 16.11 其他String方法 435 16.12 StringBuffer类 436 16.12.1 StringBuffer类的构造函数 437 16.12.2 length()与capacity() 437 16.12.3 ensureCapacity() 438 16.12.4 setLength() 438 16.12.5 charAt()与setCharAt() 438 16.12.6 getChars() 439 16.12.7 append() 439 16.12.8 insert() 440 16.12.9 reverse() 440 16.12.10 delete()与deleteCharAt() 441 16.12.11 replace() 441 16.12.12 substring() 442 16.12.13 其他StringBuffer方法 442 16.13 StringBuilder类 443 第17章 探究java.lang 445 17.1 基本类型封装器 446 17.1.1 Number 446 17.1.2 Double与Float 447 17.1.3 理解isInfinite()与isNaN() 450 17.1.4 Byte、Short、Integer和Long 451 17.1.5 Character 459 17.1.6 对Unicode代码点的附加支持 462 17.1.7 Boolean 463 17.2 Void类 464 17.3 Process类 464 17.4 Runtime类 465 17.4.1 内存管理 466 17.4.2 执行其他程序 467 17.5 ProcessBuilder类 469 17.6 System类 471 17.6.1 使用currentTimeMillis()计时程序的执行 472 17.6.2 使用arraycopy() 473 17.6.3 环境属性 474 17.7 Object类 474 17.8 使用clone()方法和Cloneable接口 475 17.9 Class类 477 17.10 ClassLoader类 480 17.11 Math类 481 17.11.1 三角函数 481 17.11.2 指数函数 481 17.11.3 舍入函数 482 17.11.4 其他数学方法 483 17.12 StrictMath类 485 17.13 Compiler类 485 17.14 Thread类、ThreadGroup类和Runnable接口 485 17.14.1 Runnable接口 485 17.14.2 Thread类 486 17.14.3 ThreadGroup类 488 17.15 ThreadLocal和 InheritableThreadLocal类 492 17.16 Package类 492 17.17 RuntimePermission类 494 17.18 Throwable类 494 17.19 SecurityManager类 494 17.20 StackTraceElement类 494 17.21 Enum类 495 17.22 ClassValue类 496 17.23 CharSequence接口 496 17.24 Comparable接口 496 17.25 Appendable接口 497 17.26 Iterable接口 497 17.27 Readable接口 498 17.28 AutoCloseable接口 498 17.29 Thread.UncaughtExceptionHandler接口 498 17.30 java.lang子包 499 17.30.1 java.lang.annotation 499 17.30.2 java.lang.instrument 499 17.30.3 java.lang.invoke 499 17.30.4 java.lang.management 499 17.30.5 java.lang.ref 499 17.30.6 java.lang.reflect 499 第18章 java.util第1部分:集合框架 501 18.1 集合概述 503 18.2 JDK 5对集合框架的修改 504 18.2.1 泛型从根本上改变了集合框架 504 18.2.2 自动装箱使得使用基本类型更加容易 504 18.2.3 for-each风格的for循环 505 18.3 集合接口 505 18.3.1 Collection接口 506 18.3.2 List接口 508 18.3.3 Set接口 509 18.3.4 SortedSet接口 509 18.3.5 NavigableSet接口 510 18.3.6 Queue接口 511 18.3.7 Deque接口 512 18.4 集合类 514 18.4.1 ArrayList类 515 18.4.2 LinkedList类 518 18.4.3 HashSet类 520 18.4.4 LinkedHashSet类 521 18.4.5 TreeSet类 521 18.4.6 PriorityQueue类 523 18.4.7 ArrayDeque类 523 18.4.8 EnumSet类 524 18.5 通过迭代器访问集合 525 18.5.1 使用迭代器 527 18.5.2 使用for-each循环替代迭代器 528 18.6 Spliterator 529 18.7 在集合中存储用户定义的类 532 18.8 RandomAccess接口 533 18.9 使用映射 534 18.9.1 映射接口 534 18.9.2 映射类 539 18.10 比较器 544 18.11 集合算法 552 18.12 Arrays类 558 18.13 遗留的类和接口 563 18.13.1 Enumeration接口 564 18.13.2 Vector类 564 18.13.3 Stack类 568 18.13.4 Dictionary类 570 18.13.5 Hashtable类 571 18.13.6 Properties类 574 18.13.7 使用store()和load() 578 18.14 集合小结 580 第19章 java.util第2部分:更多实用工具类 581 19.1 StringTokenizer类 581 19.2 BitSet类 583 19.3 Optional、OptionalDouble、OptionalInt和OptionalLong 586 19.4 Date类 588 19.5 Calendar类 590 19.6 GregorianCalendar类 593 19.7 TimeZone类 595 19.8 SimpleTimeZone类 596 19.9 Locale类 597 19.10 Random类 598 19.11 Observable类 600 19.11.1 Observer接口 601 19.11.2 Observer示例 601 19.12 Timer和TimerTask类 604 19.13 Currency类 606 19.14 Formatter类 607 19.14.1 Formatter类的构造函数 607 19.14.2 Formatter类的方法 608 19.14.3 格式化的基础知识 609 19.14.4 格式化字符串和字符 611 19.14.5 格式化数字 611 19.14.6 格式化时间和日期 612 19.14.7 %n和%%说明符 614 19.14.8 指定最小字段宽度 614 19.14.9 指定精度 616 19.14.10 使用格式标志 617 19.14.11 对齐输出 617 19.14.12 空格、“+”、“0”以及“(”标志 618 19.14.13 逗号标志 619 19.14.14 “#”标志 619 19.14.15 大写选项 619 19.14.16 使用参数索引 620 19.14.17 关闭Formatter对象 621 19.14.18 printf()方法 622 19.15 Scanner类 622 19.15.1 Scanner类的构造函数 622 19.15.2 扫描的基础知识 623 19.15.3 一些Scanner示例 626 19.15.4 设置定界符 630 19.15.5 其他Scanner特性 632 19.16 ResourceBundle、ListResourceBundle和 633 19.17 其他实用工具类和接口 637 19.18 java.util子包 638 19.18.1 java.util.concurrent、java.util.concurrent.atomic和 java.util.concurrent.locks 638 19.18.2 java.util.function 638 19.18.3 java.util.jar 641 19.18.4 java.util.logging 641 19.18.5 java.util.prefs 641 19.18.6 java.util.regex 641 19.18.7 java.util.spi 642 19.18.8 java.util.stream 642 19.18.9 java.util.zip 642 第20章 输入/输出:探究java.io 643 20.1 I/O类和接口 644 20.2 File类 645 20.2.1 目录 648 20.2.2 使用FilenameFilter接口 649 20.2.3 listFiles()方法 650 20.2.4 创建目录 650 20.3 AutoCloseable、Closeable和Flushable接口 650 20.4 I/O异常 651 20.5 关闭流的两种方式 651 20.6 流类 653 20.7 字节流 653 20.7.1 InputStream类 653 20.7.2 OutputStream类 654 20.7.3 FileInputStream类 654 20.7.4 FileOutputStream类 656 20.7.5 ByteArrayInputStream类 659 20.7.6 ByteArrayOutputStream类 660 20.7.7 过滤的字节流 662 20.7.8 缓冲的字节流 662 20.7.9 SequenceInputStream类 666 20.7.10 PrintStream类 667 20.7.11 DataOutputStream和DataInputStream类 670 20.7.12 RandomAccessFile类 671 20.8 字符流 672 20.8.1 Reader类 672 20.8.2 Writer类 673 20.8.3 FileReader类 674 20.8.4 FileWriter类 675 20.8.5 CharArrayReader类 676 20.8.6 CharArrayWriter类 677 20.8.7 BufferedReader类 678 20.8.8 BufferedWriter类 680 20.8.9 PushbackReader类 680 20.8.10 PrintWriter类 681 20.9 Console类 682 20.10 串行化 684 20.10.1 Serializable接口 684 20.10.2 Externalizable接口 685 20.10.3 ObjectOutput接口 685 20.10.4 ObjectOutputStream类 685 20.10.5 ObjectInput接口 686 20.10.6 ObjectInputStream类 687 20.10.7 串行化示例 688 20.11 流的优点 690 第21章 探究NIO 691 21.1 NIO类 691 21.2 NIO的基础知识 692 21.2.1 缓冲区 692 21.2.2 通道 694 21.2.3 字符集和选择器 695 21.3 JDK 7对NIO的增强 696 21.3.1 Path接口 696 21.3.2 Files类 697 21.3.3 Path接口 700 21.3.4 文件属性接口 700 21.3.5 FileSystem、FileSystems和FileStore类 702 21.4 使用NIO系统 702 21.4.1 为基于通道的I/O使用NIO 703 21.4.2 为基于流的I/O使用NIO 712 21.4.3 为路径和文件系统操作使用NIO 714 21.5 JDK 7之前基于通道的例子 722 21.5.1 读文件(JDK 7之前) 722 21.5.2 写文件(JDK 7之前) 726 第22章 联网 729 22.1 联网的基础知识 730 22.2 联网类和接口 731 22.3 InetAddress类 732 22.3.1 工厂方法 732 22.3.2 实例方法 733 22.4 Inet4Address类和Inet6Address类 733 22.5 TCP/IP客户端套接字 734 22.6 URL类 737 22.7 URLConnection类 739 22.8 HttpURLConnection类 741 22.9 URI类 744 22.10 cookie 744 22.11 TCP/IP服务器套接字 744 22.12 数据报 745 22.12.1 DatagramSocket类 745 22.12.2 DatagramPacket类 746 22.12.3 数据报示例 747 第23章 Applet类 749 23.1 applet的两种类型 749 23.2 applet的基础知识 750 23.3 applet的架构 753 23.4 applet的骨架 753 23.4.1 applet的初始化和终止 755 23.4.2 重写update()方法 756 23.5 简单的applet显示方法 756 23.6 请求重画 758 23.7 使用状态栏窗口 761 23.8 HTML APPLET标记 762 23.9 向applet传递参数 763 23.10 getDocumentBase()和getCodeBase() 766 23.11 AppletContext接口和showDocument()方法 767 23.12 AudioClip接口 769 23.13 AppletStub接口 769 23.14 向控制台输出 769 第24章 事件处理 771 24.1 两种事件处理机制 772 24.2 委托事件模型 772 24.2.1 事件 772 24.2.2 事件源 772 24.2.3 事件监听器 773 24.3 事件类 773 24.3.1 ActionEvent类 775 24.3.2 AdjustmentEvent类 775 24.3.3 ComponentEvent类 776 24.3.4 ContainerEvent类 777 24.3.5 FocusEvent类 777 24.3.6 InputEvent类 778 24.3.7 ItemEvent类 779 24.3.8 KeyEvent类 779 24.3.9 MouseEvent类 780 24.3.10 MouseWheelEvent类 782 24.3.11 TextEvent类 783 24.3.12 WindowEvent类 783 24.4 事件源 784 24.5 事件监听器接口 784 24.5.1 ActionListener接口 785 24.5.2 AdjustmentListener接口 785 24.5.3 ComponentListener接口 785 24.5.4 ContainerListener接口 786 24.5.5 FocusListener接口 786 24.5.6 ItemListener接口 786 24.