![]() ![]() |
零基础学Java(第5版)
Java是使用面很广的面向对象的开发语言。本书站在零基础学习的角度,通过通俗易懂的语言和丰富多彩的实例,帮助初学者尽快掌握Java语言程序设计的核心知识点而少走弯路。
本书一共分为四篇,共24章,循序渐进地讲述了Java语言的语法规则,以及Eclipse和MyEclipse开发环境的使用,从基本概念到具体实践、从入门知识到高阶主题、从语法语义到数据结构和算法都进行了详细的阐述,内容主要包括运算符、表达式、分支语句、循环语句、函数、数组、字符串、类、对象、包、继承、多态、封装、枚举、反射、标注、泛型、类加载器、动态代理、多线程、文件的操作和访问、数据的操作、数据的存储、Java数据结构、XML文件的创建和解析、数据库的连接、网络编程和界面的设计等知识点。书中的所有知识都结合具体实例进行介绍,涉及的程序代码都给出了详细的注释,有助于读者轻松领会程序开发的精髓,快速提高开发技能。
前言
第一篇 Java语言语法基础——面向过程知识 第1章 Java技术概览1 1.1 Java技术1 1.1.1 认识Java语言1 1.1.2 认识Java平台2 1.1.3 Java语言的功能3 1.1.4 Java语言的优点3 1.1.5 Java分布式应用和多线程的特点4 1.1.6 Java程序的可靠性、安全性4 1.2 Windows下的“HelloWorld”应用程序5 1.2.1 创建应用程序的软件环境5 1.2.2 创建“HelloWorld”应用程序的步骤5 1.3 深入探讨“HelloWorld”应用程序7 1.3.1 注释源代码8 1.3.2 实现类定义8 1.3.3 详解main()方法9 1.4 常见疑难解答9 1.4.1 环境变量设置错误9 1.4.2 语法错误9 1.4.3 语义错误10 1.4.4 运行时错误10 1.4.5 初学者如何选择Java参考书11 1.5 小结11 1.6 习题12 第2章 Java开发工具及环境设置13 2.1 Java开发工具简介13 2.1.1 下载并安装JDK13 2.1.2 设定环境变量16 2.1.3 验证JDK环境是否配置成功18 2.2 JDK内置工具18 2.2.1 JDK常用工具18 2.2.2 JDK常用工具的使用实例18 2.2.3 Java应用程序的发布工具20 2.3 一个简单的Java应用程序20 2.4 Java程序员的编码规则21 2.5 常见疑难解答23 2.5.1 Java文件扩展名是否区分大小写23 2.5.2 Javac xxx.java顺利通过,但Java xxx显示“NoClassDefFoundError”23 2.5.3 导致错误“Exception in thread main java.lang.NoSuchMethodError:main”的原因23 2.6 小结24 2.7 习题24 第3章 Java语言中的数据类型与运算符25 3.1 数制25 3.1.1 基本概念25 3.1.2 Java语言中的数制表现形式25 3.2 数据类型26 3.2.1 整型26 3.2.2 字符型29 3.2.3 浮点型29 3.2.4 布尔型31 3.3 变量31 3.3.1 变量的声明32 3.3.2 变量的含义32 3.3.3 变量的分类32 3.4 变量如何初始化34 3.5 常量36 3.6 运算符37 3.6.1 算术运算符37 3.6.2 关系运算符41 3.6.3 逻辑运算符42 3.6.4 位运算符44 3.6.5 移位运算符46 3.6.6 赋值运算符48 3.6.7 三元运算符49 3.6.8 逗号运算符49 3.6.9 转型运算符49 3.6.10 运算符的优先级别50 3.7 常见疑难解答50 3.7.1 如何将十进制转换成二进制50 3.7.2 转型运算符会引起精度问题,为什么还要使用它51 3.8 小结51 3.9 习题51 第4章 程序设计中的流程控制52 4.1 编程风格52 4.2 条件语句53 4.2.1 简单条件语句53 4.2.2 最简单的条件语句54 4.2.3 适应多条件的条件语句55 4.2.4 嵌套条件语句58 4.2.5 如何使用条件语句59 4.3 循环语句59 4.3.1 for循环语句59 4.3.2 while循环62 4.3.3 do…while语句65 4.4 中断与继续语句66 4.4.1 中断控制语句66 4.4.2 继续语句68 4.5 分支语句69 4.6 返回语句72 4.7 常见疑难解答72 4.7.1 普通循环是使用for语句还是while语句72 4.7.2 一般的程序可否用分支语句来代替条件语句73 4.8 小结73 4.9 习题73 第二篇 Java语言语法进阶——面向对象知识 第5章 数组75 5.1 数组概念的引入75 5.1.1 实例的引入75 5.1.2 数组的概念75 5.1.3 用实例说明数组的用处76 5.2 基本数据类型的数组76 5.2.1 基本类型数组的声明77 5.2.2 基本类型数组的初始化77 5.3 由实例引出不同数组种类及其使用78 5.3.1 认识一维数组78 5.3.2 由实例引出一维数组及其使用78 5.3.3 由实例引出二维数组及其使用81 5.4 多维数组82 5.4.1 多维数组的声明82 5.4.2 初始化多维数组83 5.4.3 使用多维数组83 5.5 数组的综合实例84 5.6 常见疑难解答88 5.6.1 声明数组需要注意什么88 5.6.2 数组在平时的程序代码中使用是否频繁88 5.7 小结88 5.8 习题88 第6章 字符串的处理90 6.1 认识字符串90 6.1.1 代码中的字符串90 6.1.2 String类和StringBuffer类的比较91 6.2 字符串处理的类库种类92 6.2.1 字符串的赋值92 6.2.2 字符串处理类——String92 6.2.3 字符串处理的方法95 6.2.4 缓冲字符串处理类——StringBuffer102 6.2.5 缓冲字符串StringBuffer类的构造器102 6.2.6 缓冲字符串的处理103 6.2.7 缓冲字符串类的特点107 6.3 用实例演示如何处理字符串107 6.4 如何格式化输出字符串108 6.5 常见疑难解答109 6.5.1 equals和“==”的区别109 6.5.2 String类为何被定义成final约束109 6.5.3 char类型如何转换成int类型,int类型如何转换成字符串109 6.6 小结109 6.7 习题110 第7章 类和对象111 7.1 面向对象开发中的类111 7.1.1 在Java中类的定义111 7.1.2 Java中的类与现实世界的类112 7.2 万事万物皆对象112 7.2.1 什么是对象112 7.2.2 操作对象113 7.2.3 初始化对象113 7.2.4 对象的成员方法114 7.2.5 对象的成员变量119 7.3 对象中访问控制符的重要性119 7.3.1 什么是访问控制符119 7.3.2 如何使用访问控制符及其重要性121 7.4 Java中的基础类123 7.4.1 Java的数学运算处理类Math123 7.4.2 测试时间和日期的类Date125 7.4.3 测试日历的类GregorianCalendar126 7.4.4 日历处理的实例解析127 7.5 用实例分析设计一个类的流程129 7.5.1 如何在现实程序设计中提取一个类129 7.5.2 设置器和访问器135 7.5.3 总结137 7.6 常见疑难解答137 7.6.1 类在程序语言中起到了什么作用137 7.6.2 设置器和访问器的作用137 7.7 小结137 7.8 习题137 第8章 重载和包138 8.1 重载138 8.1.1 什么是重载138 8.1.2 用实例来说明重载的意义139 8.2 包140 8.2.1 什么是Java中的包140 8.2.2 如何实现包140 8.2.3 什么是类路径和默认包142 8.2.4 包的作用域142 8.2.5 静态导入142 8.3 包的注释及嵌入文档144 8.3.1 如何添加注释144 8.3.2 类、方法、字段等注释的方法144 8.4 常见疑难解答145 8.4.1 包在实际编程中究竟有什么作用145 8.4.2 一个文件中定义了两个class类是否生成一个.class文件145 8.5 小结145 8.6 习题145 第9章 继承和多态147 9.1 什么是继承147 9.1.1 继承的引出147 9.1.2 继承的概念148 9.1.3 如何实现继承149 9.1.4 如何设计继承151 9.2 构造函数的使用151 9.2.1 什么是构造函数151 9.2.2 继承中构造函数的初始化152 9.2.3 替代父类和本身的方式153 9.2.4 Java中的单继承性154 9.3 继承中的覆盖现象154 9.4 类之间的关系154 9.4.1 依赖155 9.4.2 聚合155 9.4.3 继承155 9.5 继承层次图156 9.6 多态156 9.6.1 多态的产生156 9.6.2 多态的概念157 9.6.3 使用多态编写程序158 9.6.4 覆盖的应用159 9.6.5 重载与覆盖的实例对比160 9.6.6 覆盖的多态性160 9.6.7 传值引用和传址引用162 9.7 通过实例熟悉多态用法163 9.8 绑定165 9.8.1 静态绑定165 9.8.2 动态绑定165 9.9 超类165 9.9.1 什么是超类165 9.9.2 equals方法的使用166 9.9.3 通用编程166 9.10 常见疑难解答166 9.10.1 Java不支持多继承,如何处理一个类继承多个父类的情况166 9.10.2 如果出现了带参数的构造函数,可否不在代码中写出来167 9.10.3 动态和静态编译是什么167 9.10.4 绑定与多态的联系是什么167 9.10.5 多态与重载的区别是什么167 9.11 小结167 9.12 习题167 第10章 接口与内部类171 10.1 接口171 10.1.1 接口概念的引入171 10.1.2 接口的声明172 10.1.3 接口的实现172 10.1.4 接口的多重实现177 10.1.5 接口的属性182 10.1.6 接口的继承182 10.2 内部类188 10.2.1 使用内部类来访问对象188 10.2.2 局部内部类191 10.2.3 静态内部类194 10.2.4 匿名内部类194 10.3 常见疑难解答194 10.3.1 匿名类如何在程序中使用194 10.3.2 接口与继承有什么区别194 10.4 小结194 10.5 习题194 第11章 抽象和封装196 11.1 抽象的概念196 11.1.1 什么是抽象196 11.1.2 抽象的综合实例197 11.2 抽象类200 11.2.1 什么是抽象类200 11.2.2 抽象类的实例200 11.3 抽象与接口的区别205 11.4 枚举205 11.4.1 关于枚举的实现原理205 11.4.2 枚举的简单应用207 11.4.3 关于枚举的高级特性208 11.5 反射210 11.5.1 关于反射的基石——Class类210 11.5.2 关于反射的基本应用212 11.5.3 关于反射的高级应用216 11.6 标注219 11.6.1 标注的简单使用219 11.6.2 关于JDK的内置标注221 11.7 泛型223 11.7.1 为什么要使用泛型223 11.7.2 关于泛型的一些特性226 11.7.3 关于泛型的通配符228 11.8 类加载器229 11.8.1 什么是类加载器230 11.8.2 什么是类加载器的委派模型231 11.9 动态代理232 11.9.1 什么是代理232 11.9.2 关于动态代理基础类233 11.9.3 关于InvocationHandler接口237 11.9.4 动态代理类的设计模式240 11.10 封装的概念242 11.10.1 一个封装的例子242 11.10.2 在程序设计中为什么要使用封装244 11.10.3 在程序设计中设计封装的注意点246 11.11 结合实例讲述如何设计封装246 11.12 常见疑难解答251 11.12.1 抽象类和接口在概念上有什么区别251 11.12.2 如何从设计理念上看待抽象类和接口251 11.12.3 封装在现实开发中给程序员带来什么启发253 11.12.4 封装在实际开发中的应用有哪些254 11.13 小结254 11.14 习题255 第三篇 Java语言编程主题 第12章 线程257 12.1 线程的基本概念257 12.1.1 进程及其使用环境257 12.1.2 线程及其使用环境257 12.2 线程的创建258 12.2.1 如何创建线程258 12.2.2 通过实例熟悉如何创建线程261 12.2.3 线程的状态264 12.3 线程的使用266 12.3.1 线程的优先级266 12.3.2 线程的休眠与唤醒267 12.3.3 线程让步271 12.3.4 线程同步272 12.3.5 同步块274 12.3.6 同步化方法277 12.4 实例分析278 12.4.1 生产者与消费者的程序设计及分析278 12.4.2 多消费者的程序设计及分析280 12.4.3 多生产者的程序设计及分析283 12.5 常见疑难解答288 12.5.1 Java中线程与线程之间怎么通信288 12.5.2 什么是进程的死锁和饥饿288 12.5.3 什么时候会涉及线程程序289 12.5.4 多线程的死锁问题289 12.5.5 多线程的缺点290 12.6 小结290 12.7 习题290 第13章 异常的处理与内存的管理292 13.1 异常的概念292 13.1.1 异常的分类292 13.1.2 异常的声明293 13.1.3 异常的抛出throw294 13.2 异常的捕获295 13.2.1 捕获多个异常296 13.2.2 自定义异常298 13.2.3 运行期异常299 13.2.4 执行finally子句300 13.2.5 finally子句的必要性301 13.3 内存的管理和回收303 13.4 常见疑难解答304 13.4.1 为什么要声明方法抛出异常304 13.4.2 为什么抛出的异常一定是检查异常304 13.5 小结305 13.6 习题305 第14章 Java输入与输出306 14.1 输入与输出的重要性306 14.2 Java重要的输入输出类306 14.3 文件或目录信息的处理307 14.3.1 File类常用的操作方法307 14.3.2 文件处理方法的应用308 14.3.3 文件和目录的操作308 14.4 读取数据的媒介之一——流310 14.4.1 什么是流311 14.4.2 什么是输入流和输出流311 14.4.3 字节输入流及输出流311 14.4.4 使用文件字节输入流读取文件312 14.4.5 使用文件字节输出流输出文件313 14.5 多字节数据读取类——Filter类315 14.5.1 Filter流的概念315 14.5.2 处理字节类型以外的文件输入315 14.5.3 处理字节类型以外的文件输出316 14.5.4 增强的多字节输出流DataOutput316 14.5.5 增强的多字节输入流DataInput317 14.6 读取数据的媒介之二——字符流320 14.6.1 字符流的概念320 14.6.2 抽象字符输入流Reader类的使用320 14.6.3 抽象字符输出流Writer类的使用321 14.6.4 读取带缓存的BufferedReader字符流321 14.6.5 带缓存的字符输出流BufferedWriter类322 14.6.6 字符输入流FileReader类和FileWriter类的使用325 14.6.7 如何用标准输入流System.in来获取数据326 14.6.8 打印输入流PrintWriter类与PrintStream类的区别327 14.6.9 随机文件访问RandomAccessFile类329 14.7 利用对象序列化控制输入输出331 14.7.1 什么是对象序列化331 14.7.2 基本数据和对象数据读写ObjectInput接口与ObjectOutput接口332 14.7.3 对象序列化处理ObjectOutputStream类332 14.7.4 对象序列化处理ObjectInputStream类333 14.8 常见疑难解答333 14.8.1 字节流与字符流的主要区别333 14.8.2 输入流与输出流如何区分,各有什么作用334 14.8.3 什么是管道流334 14.9 小结335 14.10 习题335 第15章 Java中对数据的处理336 15.1 如何将基本数据类型转换为对象336 15.1.1 为什么要将基本数据转换为对象336 15.1.2 Wrapper类的构造函数337 15.1.3 包装类的常用函数338 15.1.4 基本数据的拆装箱操作339 15.2 如何处理随机性的数据341 15.2.1 Random类的基础知识341 15.2.2 通过实例熟悉Random类的常用方法342 15.3 如何对数据进行排列、整理345 15.3.1 Arrays类的常用方法345 15.3.2 实例分析347 15.4 常见疑难解答350 15.4.1 Random类函数在现实生活中有什么用处350 15.4.2 数组的排列和整理数据在实际应用中有什么用处350 15.5 小结351 15.6 习题351 第16章 数据结构接口352 16.1 数据结构接口及实现352 16.1.1 数据结构接口的实质352 16.1.2 用实例来熟悉数据结构接口的实现353 16.2 Collection集合接口与Iterator迭代器接口354 16.2.1 熟悉Collection集合接口354 16.2.2 List接口和Set接口355 16.2.3 Map映射接口356 16.2.4 Iterator迭代器接口357 16.2.5 通过实例来认识迭代器的实现358 16.3 常见疑难解答360 16.3.1 Collection集合接口和Collections集合类的区别360 16.3.2 ArrayList数组列表类和Vector存储类的区别360 16.3.3 HashMap散列映射和Hashtable散列表的区别360 16.3.4 数据结构的种类有哪些360 16.3.5 List接口和Set接口的区别360 16.4 小结361 16.5 习题361 第17章 Java中的数据结构362 17.1 链表362 17.1.1 什么是Java中的链表362 17.1.2 用程序代码段实现对链表的添加363 17.1.3 用程序代码段实现对链表的删除365 17.2 数组列表类369 17.2.1 什么是数组列表类369 17.2.2 通过实例熟悉数组列表如何存储数据370 17.3 散列表374 17.3.1 什么是散列表374 17.3.2 通过实例熟悉散列表如何存储数据374 17.4 散列集378 17.4.1 什么是散列集378 17.4.2 通过实例熟悉散列集如何存储数据378 17.5 树集383 17.5.1 什么是树集383 17.5.2 通过实例熟悉树集如何存储数据384 17.6 映像387 17.6.1 什么是映像387 17.6.2 通过实例熟悉映像如何存储数据387 17.7 常见疑难解答391 17.7.1 哪些是线程安全的数据结构391 17.7.2 Vector是什么样的数据结构391 17.8 小结392 17.9 习题392 第18章 XML基础393 18.1 XML和HTML393 18.1.1 XML的产生393 18.1.2 XML与HTML的比较394 18.2 XML的编辑工具395 18.3 创建XML文档395 18.3.1 XML的声明396 18.3.2 文档类型的声明396 18.3.3 元素397 18.3.4 注释398 18.3.5 处理指令398 18.3.6 空白处理398 18.3.7 行尾处理399 18.3.8 语言标识399 18.3.9 一个简单的有关XML的实例399 18.4 关于XML的高级知识400 18.4.1 什么才是格式良好的XML文档400 18.4.2 DTD文档的作用401 18.4.3 DTD的结构401 18.4.4 几个有关DTD的简单实例403 18.5 关于XML文档的操作405 18.5.1 下载Dom4J组件405 18.5.2 配置Dom4J组件406 18.5.3 Dom4J组件的简单使用——解析XML文件406 18.5.4 Dom4J组件的简单使用——创建XML文件409 18.6 关于XML文档的高级操作411 18.6.1 下载Sax类库411 18.6.2 配置Sax组件412 18.6.3 Sax组件的简单使用——解析XML文件412 18.7 常见疑难解答415 18.7.1 XML与HTML的区别415 18.7.2 XML有哪些显示数据的方式415 18.8 小结416 18.9 习题416 第19章 开发工具的使用417 19.1 Eclipse简介417 19.1.1 下载并安装Eclipse418 19.1.2 Eclipse界面介绍419 19.2 如何使用Eclipse进行开发422 19.2.1 如何新建一个Java工程422 19.2.2 如何新建一个Java类424 19.2.3 编写代码425 19.3 如何使用MyEclipse进行开发426 19.3.1 下载并安装MyEclipse427 19.3.2 关于MyEclipse的一些常用操作428 19.4 常见疑难解答431 19.4.1 Eclipse和UltraEdit两个开发工具的优缺点431 19.4.2 什么是IDE环境431 19.4.3 有关Eclipse的编译报错的原因431 19.5 小结431 19.6 习题432 第20章 Swing组件与布局管理器433 20.1 什么是Swing编程433 20.2 MVC设计模式基础433 20.3 简单框架设计及实例434 20.3.1 创建一个空白的框架434 20.3.2 创建框架的其他工作435 20.4 简单图形按钮控件的设计及实例436 20.4.1 Swing中的按钮控件436 20.4.2 按钮的模型437 20.4.3 添加普通按钮437 20.4.4 添加单选按钮438 20.4.5 添加复选框440 20.4.6 ToggleButton按钮441 20.5 简单文本输入组件的设计及实例442 20.5.1 文本域442 20.5.2 密码域443 20.5.3 文本区域444 20.6 展示类组件的设计及实例445 20.6.1 标签组件445 20.6.2 选择组件446 20.6.3 菜单组件447 20.6.4 对话框的种类及用法448 20.7 复杂布局管理器的种类及用法449 20.7.1 箱式布局的设计450 20.7.2 网格组布局的设计452 20.7.3 流布局的设计452 20.7.4 边界布局的设计454 20.8 通过实例熟悉Swing编程455 20.9 常见疑难解答457 20.9.1 如何处理菜单的启用和禁用功能457 20.9.2 如何编写快捷键的程序458 20.10 小结458 20.11 习题458 第21章 JDBC及其应用459 21.1 数据库基础知识459 21.1.1 什么是数据库459 21.1.2 数据库的分类及功能460 21.1.3 关系数据库的设计460 21.1.4 数据库设计技巧461 21.2 JDBC的基础概念462 21.2.1 JDBC驱动程序的分类462 21.2.2 利用Java到数据库协议方式连接Oracle数据库463 21.2.3 利用Java到本地API方式连接Oracle数据库464 21.3 关于SQL Server数据库基础操作466 21.3.1 什么是支持SQL语言的数据库466 21.3.2 通过SQL语言如何操作数据库467 21.3.3 安装SQL Server468 21.3.4 高级SQL类型469 21.3.5 使用SQL创建数据库470 21.4 关于JDBC的高级操作477 21.4.1 什么是事务处理477 21.4.2 事务处理的过程演练477 21.4.3 预查询480 21.4.4 使用JDBC的注意事项480 21.5 常见疑难解答481 21.5.1 操作数据库的具体步骤是什么481 21.5.2 数据库中的视图、图表、缺省值、规则、触发器、存储过程的意义482 21.6 小结482 21.7 习题482 第22章 网络编程基础484 22.1 网络基础知识484 22.2 TCP/IP协议和UDP协议484 22.2.1 IP协议和IP地址485 22.2.2 TCP协议和端口487 22.2.3 客户端/服务器通信模型487 22.2.4 UDP协议488 22.3 端口与套接字489 22.4 TCP程序设计基础489 22.4.1 如何设计TCP程序490 22.4.2 一个简单的例子492 22.5 UDP程序设计基础493 22.5.1 如何设计UDP程序493 22.5.2 一个简单的例子493 22.6 如何设计网络程序494 22.6.1 单向通信综合实例495 22.6.2 双向通信综合实例497 22.7 常见疑难解答500 22.7.1 TCP和UDP的区别500 22.7.2 什么是TCP/IP协议,分为几层,什么功能501 22.8 小结502 22.9 习题502 第四篇 Java语言程序设计实例与面试题剖析 第23章 学校管理系统503 23.1 开发背景503 23.2 需求分析503 23.3 登录界面的设计504 23.3.1 登录界面的分析504 23.3.2 登录界面的代码实现504 23.3.3 登录界面的运行506 23.4 主菜单界面的设计507 23.4.1 主菜单界面的分析507 23.4.2 主菜单界面的代码实现507 23.4.3 主菜单界面的运行515 23.5 数据库系统的设计516 23.5.1 数据库中表的创建516 23.5.2 数据库中的代码段519 23.6 学生信息系统界面的设计520 23.6.1 学生类的设计520 23.6.2 存储类的设计521 23.6.3 学生信息系统界面的代码实现523 23.7 教师信息系统界面的设计531 23.7.1 教师类的设计531 23.7.2 存储类的设计533 23.7.3 教师信息系统界面的代码实现535 23.8 领导信息系统界面的设计543 23.8.1 领导类的设计543 23.8.2 存储类的设计544 23.8.3 领导信息系统界面的代码实现545 23.9 小结553 第24章 面试题554 面试题1 Java的引用和C++的指针有什么区别554 面试题2 类和对象有什么区别555 面试题3 说明private、protected、public和default的区别556 面试题4 Java可以用非0来代表true吗557 面试题5 StringBuffer和StringBuilder存在的作用是什么557 面试题6 二维数组的长度是否固定558 面试题7 符合什么条件的数据集合可以使用foreach循环559 面试题8 如何序列化和反序列化一个Java对象560 面试题9 如何使用Java的线程池561 面试题10 如何利用反射实例化一个类561 面试题11 TCP协议的通信特点是什么561 面试题12 请简述JDBC操作数据库的编程步骤561 面试题13 如何使用连接池技术561 面试题14 简述接口和抽象类的区别562 面试题15 如何理解Java中的装箱和拆箱562 面试题16 根据代码判断创建的对象个数563 面试题17 分析循环程序的运行结果563 面试题18 可以返回最大值的方法564 面试题19 关于垃圾回收的疑问564 面试题20 线程问题:找出代码中的错误565 面试题21 关于ArrayList、Vector、LinkedList的问答题565 面试题22 Java中的异常处理机制的简单原理和应用566 面试题23 列举一些常用的类、包、接口,请各列举5个566 面试题24 Java 中,DOM 和 SAX 解析器有什么不同566 面试题25 线程的sleep()方法和yield()方法有什么区别566
你还可能感兴趣
我要评论
|