新書推薦:
《
爱丁堡古罗马史-罗马城的起源和共和国的崛起
》
售價:NT$
349.0
《
自伤自恋的精神分析
》
售價:NT$
240.0
《
大宋悬疑录:貔貅刑
》
售價:NT$
340.0
《
不被大风吹倒
》
售價:NT$
300.0
《
人生解忧:佛学入门四十讲
》
售價:NT$
490.0
《
东野圭吾:分身(东野圭吾无法再现的双女主之作 奇绝瑰丽、残忍又温情)
》
售價:NT$
295.0
《
浪潮将至
》
售價:NT$
395.0
《
在虚无时代:与马克斯·韦伯共同思考
》
售價:NT$
260.0
|
編輯推薦: |
基础与实战。相关概念及知识点都辅以相应的实例,通俗易懂,便于理解掌握面向对象的编程思想。实用与流行。涵盖了Java开发过程中重要的及流行的方法和技巧,讲解细致,环环相扣。教学与互动。文字叙述注重可读性,知识组织注意合理性,提供辅助在线教学平台。
|
內容簡介: |
Java 语言是一种很优秀的语言,具有面向对象、与平台无关、安全、稳定和多线程等优良特性,特别适合于网络应用程序的设计,已经成为网络时代*重要的语言之一。 全书共分15章,分别介绍了Java的基本数据类型,运算符、表达式和语句,类与对象,子类与继承,接口与实现,内部类与异常类,常用实用类,组件及事件处理,输入、输出流,JDBC与MySQL数据库,Java多线程机制,Java网络编程,图形、图像与音频,泛型与集合框架等内容。 本书注重可读性和实用性,配备了大量的例题和习题。这些例题和习题都经过精心的考虑,既能帮助理解知识,又具有启发性。本书通俗易懂,便于自学,针对较难理解的问题,都是从简单到复杂,逐步深入地引入例子,便于读者掌握Java面向对象编程思想。扫描每章提供的二维码可观看相应章节的视频讲解。 本书既可作为高等院校相关专业Java程序设计的教材,也可供自学者及软件开发人员参考。
|
目錄:
|
目录 第1章 Java入门
1.1 Java的地位... 1
1.1.1 网络地位... 2
1.1.2 语言地位... 2
1.1.3 需求地位... 2
1.2 Java的特点... 2
1.2.1 简单... 2
1.2.2 面向对象... 2
1.2.3 平台无关... 3
1.2.4 多线程... 4
1.2.5 动态... 4
1.3 安装JDK.. 5
1.3.1 平台简介... 5
1.3.2 安装Java SE平台... 5
1.3.3 系统环境的设置... 7
1.4 Java程序的开发步骤... 8
1.5 简单的Java应用程序... 9
1.5.1 源文件的编写与保存... 9
1.5.2 编译... 10
1.5.3 运行... 11
1.6 Java反编译... 13
1.7 编程风格... 13
1.7.1 Allmans风格... 13
1.7.2 Kernighan风格... 14
1.7.3 注释... 14
1.8 Java之父James Gosling.. 15
1.9 小结... 15
习题1. 15
第2章 基本数据类型与数组
2.1 标识符与关键字... 17
2.1.1 标识符... 17
2.1.2 Unicode字符集... 17
2.1.3 关键字... 18
2.2 基本数据类型... 18
2.2.1 逻辑类型... 18
2.2.2 整数类型... 18
2.2.3 字符类型... 19
2.2.4 浮点类型... 20
2.3 类型转换运算... 21
2.4 输入、输出数据... 23
2.4.1 输入基本型数据... 23
2.4.2 输出基本型数据... 23
2.5 数组... 24
2.5.1 声明数组... 24
2.5.2 为数组分配元素... 25
2.5.3 数组元素的使用... 26
2.5.4 length的使用... 27
2.5.5 数组的初始化... 27
2.5.6 数组的引用... 27
2.6 应用举例... 29
2.7 小结... 30
习题2. 30
第3章 运算符、表达式和语句
3.1 运算符与表达式... 33
3.1.1 算术运算符与算术表达式... 33
3.1.2 自增、自减运算符... 33
3.1.3 算术混合运算的精度... 34
3.1.4 关系运算符与关系表达式... 34
3.1.5 逻辑运算符与逻辑表达式... 34
3.1.6 赋值运算符与赋值表达式... 35
3.1.7 位运算符... 35
3.1.8 instanceof运算符... 37
3.1.9 运算符综述... 37
3.2 语句概述... 38
3.3 if条件分支语句... 38
3.3.1 if语句... 38
3.3.2 if-else语句... 39
3.3.3 if-else if-else语句... 40
3.4 switch开关语句... 41
3.5 循环语句... 43
3.5.1 for循环语句... 43
3.5.2 while循环语句... 44
3.5.3 do-while循环语句... 44
3.6 break和continue语句... 45
3.7 for语句与数组... 46
3.8 应用举例... 47
3.9 小结... 47
习题3. 48
第4章 类与对象
4.1 编程语言的几个发展阶段... 50
4.1.1 面向机器语言... 50
4.1.2 面向过程语言... 50
4.1.3 面向对象语言... 51
4.2 类... 52
4.2.1 类声明... 52
4.2.2 类体... 53
4.2.3 成员变量... 53
4.2.4 方法... 55
4.2.5 需要注意的问题... 57
4.2.6 类的UML图... 57
4.3 构造方法与对象的创建... 57
4.3.1 构造方法... 58
4.3.2 创建对象... 59
4.3.3 使用对象... 62
4.3.4 对象的引用和实体... 63
4.4 类与程序的基本结构... 66
4.5 参数传值... 68
4.5.1 传值机制... 68
4.5.2 基本数据类型参数的传值... 68
4.5.3 引用类型参数的传值... 69
4.5.4 可变参数... 70
4.6 对象的组合... 71
4.6.1 组合与复用... 72
4.6.2 类的关联关系和依赖关系的UML图... 76
4.7 实例成员与类成员... 77
4.7.1 实例变量和类变量的声明... 77
4.7.2 实例变量和类变量的区别... 77
4.7.3 实例方法和类方法的定义... 79
4.7.4 实例方法和类方法的区别... 79
4.8 方法重载... 81
4.8.1 方法重载的语法规则... 81
4.8.2 避免重载出现歧义... 83
4.9 this关键字... 84
4.9.1 在构造方法中使用this. 84
4.9.2 在实例方法中使用this. 84
4.10 包... 86
4.10.1 包语句... 86
4.10.2 有包名的类的存储目录... 86
4.10.3 运行有包名的主类... 87
4.11 import语句... 88
4.11.1 引入类库中的类... 88
4.11.2 引入自定义包中的类... 90
4.12 访问权限... 91
4.12.1 何谓访问权限... 91
4.12.2 私有变量和私有方法... 92
4.12.3 共有变量和共有方法... 93
4.12.4 友好变量和友好方法... 93
4.12.5 受保护的成员变量和方法... 94
4.12.6 public类与友好类... 95
4.13 基本类型的类封装... 95
4.13.1 Double和Float类... 95
4.13.2 Byte、Short、Integer、Long类... 95
4.13.3 Character类... 95
4.14 对象数组... 96
4.15 JRE扩展与jar文件... 97
4.16 文档生成器... 98
4.17 应用举例... 99
4.18 小结... 105
习题4. 105
第5章 子类与继承
5.1 子类与父类... 112
5.1.1 子类... 112
5.1.2 类的树形结构... 113
5.2 子类的继承性... 113
5.2.1 子类和父类在同一包中的继承性... 113
5.2.2 子类和父类不在同一包中的继承性... 115
5.2.3 继承关系(Generalization)的UML图... 115
5.2.4 protected的进一步说明... 115
5.3 子类与对象... 115
5.3.1 子类对象的特点... 115
5.3.2 关于instanceof运算符... 117
5.4 成员变量的隐藏和方法重写... 117
5.4.1 成员变量的隐藏... 117
5.4.2 方法重写... 118
5.5 super关键字... 122
5.5.1 用super操作被隐藏的成员变量和方法... 122
5.5.2 使用super调用父类的构造方法... 124
5.6 final关键字... 125
5.6.1 final类... 125
5.6.2 final方法... 125
5.6.3 常量... 125
5.7 对象的上转型对象... 126
5.8 继承与多态... 128
5.9 abstract类和abstract方法... 129
5.10 面向抽象编程... 131
5.11 开-闭原则... 134
5.12 应用举例... 135
5.13 小结... 138
习题5. 138
第6章 接口与实现
6.1 接口... 145
6.2 实现接口... 146
6.3 接口的UML图... 148
6.4 接口回调... 149
6.5 理解接口... 150
6.6 接口与多态... 152
6.7 接口参数... 153
6.8 abstract类与接口的比较... 154
6.9 面向接口编程... 155
6.10 应用举例... 155
6.11 小结... 158
习题6. 158
第7章 内部类与异常类
7.1 内部类... 162
7.2 匿名类... 163
7.2.1 和子类有关的匿名类... 163
7.2.2 和接口有关的匿名类... 165
7.3 异常类... 166
7.3.1 try-catch语句... 167
7.3.2 自定义异常类... 168
7.4 断言... 169
7.5 应用举例... 171
7.6 小结... 172
习题7. 172
第8章 常用实用类
8.1 String类... 175
8.1.1 构造String对象... 175
8.1.2 字符串的并置... 177
8.1.3 String类的常用方法... 178
8.1.4 字符串与基本数据的相互转化... 182
8.1.5 对象的字符串表示... 183
8.1.6 字符串与字符数组、字节数组... 184
8.1.7 正则表达式及字符串的替换与分解... 186
8.2 StringTokenizer类... 191
8.3 Scanner类... 192
8.4 StringBuffer类... 194
8.4.1 StringBuffer对象... 194
8.4.2 StringBuffer类的常用方法... 195
8.5 Date类与Calendar类... 196
8.5.1 Date类... 197
8.5.2 Calendar类... 197
8.6 日期的格式化... 200
8.6.1 format方法... 200
8.6.2 不同区域的星期格式... 202
8.7 Math类、BigInteger类和Random类... 202
8.7.1 Math类... 202
8.7.2 BigInteger类... 203
8.7.3 Random类... 204
8.8 数字格式化... 206
8.8.1 format方法... 206
8.8.2 格式化整数... 207
8.8.3 格式化浮点数... 208
8.9 Class类与Console类... 209
8.9.1 Class类... 209
8.9.2 Console类... 211
8.10 Pattern类与Matcher类... 212
8.11 应用举例... 214
8.12 小结... 215
习题8. 216
第9章 组件及事件处理
9.1 Java Swing概述... 221
9.2 窗口... 222
9.2.1 JFrame常用方法... 222
9.2.2 菜单条、菜单、菜单项... 224
9.3 常用组件与布局... 225
9.3.1 常用组件... 225
9.3.2 常用容器... 227
9.3.3 常用布局... 228
9.4 处理事件... 233
9.4.1 事件处理模式... 233
9.4.2 ActionEvent事件... 234
9.4.3 ItemEvent事件... 238
9.4.4 DocumentEvent事件... 241
9.4.5 MouseEvent事件... 244
9.4.6 焦点事件... 249
9.4.7 键盘事件... 249
9.4.8 窗口事件... 252
9.4.9 匿名类实例或窗口做监视器... 253
9.4.10 事件总结... 256
9.5 使用MVC结构... 256
9.6 对话框... 259
9.6.1 消息对话框... 259
9.6.2 输入对话框... 260
9.6.3 确认对话框... 262
9.6.4 颜色对话框... 264
9.6.5 自定义对话框... 265
9.7 树组件与表格组件... 266
9.7.1 树组件... 266
9.7.2 表格组件... 269
9.8 按钮绑定到键盘... 271
9.9 打印组件... 273
9.10 发布GUI程序... 275
9.11 应用举例... 276
9.12 小结... 279
习题9. 279
第10章 输入、输出流
10.1 File类... 281
10.1.1 文件的属性... 282
10.1.2 目录... 283
10.1.3 文件的创建与删除... 284
10.1.4 运行可执行文件... 284
10.2 文件字节输入流... 285
10.3 文件字节输出流... 287
10.4 文件字符输入、输出流... 289
10.5 缓冲流... 290
10.6 随机流... 292
10.7 数组流... 295
10.8 数据流... 297
10.9 对象流... 299
10.10 序列化与对象克隆... 301
10.11 使用Scanner解析文件... 303
10.12 文件对话框... 306
10.13 带进度条的输入流... 308
10.14 文件锁... 309
10.15 应用举例... 311
10.16 小结... 318
习题10. 319
第11章 JDBC与MySQL数据库
11.1 MySQL数据库管理系统... 322
11.2 启动MySQL数据库服务器... 323
11.3 MySQL客户端管理工具... 325
11.4 JDBC.. 327
11.5 连接数据库... 328
11.6 查询操作... 330
11.6.1 顺序查询... 332
11.6.2 控制游标... 333
11.6.3 条件与排序查询... 335
11.7 更新、添加与删除操作... 337
11.8 使用预处理语句... 338
11.8.1 预处理语句的优点... 338
11.8.2 使用通配符... 339
11.9 通用查询... 340
11.10 事务... 343
11.10.1 事务及处理... 343
11.10.2 JDBC事务处理步骤... 343
11.11 连接SQL Server数据库... 345
11.12 连接Derby数据库... 346
11.13 应用举例... 348
11.13.1 设计思路... 348
11.13.2 具体设计... 349
11.13.3 用户程序... 356
11.14 小结... 357
习题11. 358
第12章 Java多线程机制
12.1 进程与线程... 359
12.1.1 操作系统与进程... 359
12.1.2 进程与线程... 359
12.2 Java中的线程... 360
12.2.1 Java的多线程机制... 360
12.2.2 主线程(main线程)... 360
12.2.3 线程的状态与生命周期... 361
12.2.4 线程调度与优先级... 364
12.3 Thread类与线程的创建... 365
12.3.1 使用Thread的子类... 365
12.3.2 使用Thread类... 365
12.3.3 目标对象与线程的关系... 367
12.3.4 关于run方法启动的次数... 369
12.4 线程的常用方法... 369
12.5 线程同步... 373
12.6 协调同步的线程... 375
12.7 线程联合... 377
12.8 GUI线程... 378
12.9 计时器线程... 382
12.10 守护线程... 384
12.11 应用举例... 385
12.12 小结... 388
习题12. 389
第13章 Java网络编程
13.1 URL类... 396
13.1.1 URL的构造方法... 396
13.1.2 读取URL中的资源... 397
13.2 InetAddress类... 398
13.2.1 地址的表示... 398
13.2.2 获取地址... 398
13.3 套接字... 399
13.3.1 套接字概述... 399
13.3.2 客户端套接字... 400
13.3.3 ServerSocket对象与服务器端套接字... 400
13.3.4 使用多线程技术... 403
13.4 UDP数据报... 407
13.4.1 发送数据包... 407
13.4.2 接收数据包... 408
13.5 广播数据报... 411
13.6 Java远程调用... 414
13.6.1 远程对象及其代理... 414
13.6.2 RMI的设计细节... 415
13.7 应用举例... 418
13.8 小结... 423
习题13. 424
第14章 图形、图像与音频
14.1 绘制基本图形... 425
14.2 变换图形... 427
14.3 图形的布尔运算... 429
14.4 绘制钟表... 430
14.5 绘制图像... 433
14.6 播放音频... 434
14.7 应用举例... 437
14.8 小结... 439
习题14. 439
第15章 泛型与集合框架
15.1 泛型... 441
15.1.1 泛型类声明... 441
15.1.2 使用泛型类声明对象... 442
15.2 链表... 444
15.2.1 LinkedList泛型类... 444
15.2.2 常用方法... 445
15.2.3 遍历链表... 445
15.2.4 排序与查找... 447
15.2.5 洗牌与旋转... 449
15.3 堆栈... 450
15.4 散列映射... 451
15.4.1 HashMap泛型类... 451
15.4.2 常用方法... 452
15.4.3 遍历散列映射... 452
15.4.4 基于散列映射的查询... 452
15.5 树集... 454
15.5.1 TreeSet泛型类... 454
15.5.2 结点的大小关系... 454
15.5.3 TreeSet类的常用方法... 455
15.6 树映射... 456
15.7 自动装箱与拆箱... 458
15.8 应用举例... 459
15.9 小结... 463
习题15. 464
|
內容試閱:
|
前言 本书是《Java 2实用教程》的第5版,继续保留原教材的特点注重教材的可读性和实用性,许多例题都经过精心的考虑,既能帮助理解知识,又具有启发性。在第5版中,对部分章节的内容做了调整,删除了原第16章的有关Java Applet的内容;特别修改了原第11章,将数据库改为MySQL数据库。全书共分15章,分别介绍Java的基本数据类型,运算符、表达式和语句,类与对象,子类与继承,接口与实现,内部类与异常类,常用实用类,组件及事件处理,输入、输出流,JDBC与MySQL数据库,Java多线程机制,Java网络编程,图形、图像与音频,泛型与集合框架等内容。第1章介绍Java语言的来历、地位和重要性,详细讲解了Java平台。第2章讲解基本数据类型。第3章介绍Java运算符和控制语句。第4~7章是本书的重点内容之一,讲述了类与对象、子类与继承、接口与多态、内部类与异常类等内容,对许多重要的知识点都结合例子给予了详细的讲解,特别强调了面向抽象和接口的设计思想以及软件设计的开闭原则。第8章讲述常用的实用类,包括字符串、日期、正则表达式、模式匹配以及数学计算等实用类,特别讲解了怎样使用StringTokenizer、Scanner、Pattern和Matcher类解析字符串。第9章介绍了组件的有关知识,把对事件处理的讲解分散到具体的组件,只要真正理解掌握了一种组件事件的处理过程,就会掌握其他组件的事件处理。输入流、输出流是Java语言中的经典内容,尽管Java提供了二十多种流,但它们的用法、原理却很类似。第10章在输入流、输出流的讲解上突出原理,特别详细地讲解了利用对象流克隆对象的原理。第11章结合例子讲解Java与数据库的连接过程,主要讲解Java怎样使用JDBC操作数据库,特别讲解了预处理、事务处理和批处理等重要技术。多线程是Java语言中的一大特点,占有很重要的地位。第12章通过有针对性的例子使读者掌握多线程中的重要概念,并介绍怎样用多线程来解决实际问题。第13章是关于网络编程的知识,针对套接字,用通俗而准确的语言给予了详细的讲解,使学生认识到多线程在网络编程中的重要作用,在内容上结合已学知识给出了一些实用性很强的例子,学生可举一反三编写相应的网络程序。第14章是有关图形、图像和音频的知识,结合已学知识给出了许多实用的例子。怎样有效地使用数据永远是程序设计中最重要的内容之一,在第15章讲述了常用数据结构的Java实现,在讲述这些内容时,特别强调如何有效合理地使用各种数据结构。扫描每章提供的二维码可观看相应章节的视频讲解。登录http:tup.tsinghua.edu.cn 可获取全部源代码和教学资源。智学苑www.izhixue.cn也提供全部视频讲解以及题库、教学指南等教学资料(使用细节见封底)。教师可加入作者的教材交流群进行教学交流(QQ:238455879)。关注作者的微信公众号gengxy1962可以在作者的视频引导下完成一个基于数据库的课程设计。希望本书能对读者学习Java有所帮助,并恳请读者批评指正。耿祥义2017年1月
第3章 运算符、表达式和语句主要内容?运算符与表达式?语句概述?if条件分支语句?switch开关语句?循环语句?break和continue语句?数组与for语句3.1 运算符与表达式Java提供了丰富的运算符,如算术运算符、关系运算符、逻辑运算符、位运算符等。Java语言中的绝大多数运算符和C语言相同,基本语句如条件分支语句、循环语句等也和C语言类似,因此,本章就主要知识点给予简单的介绍。3.1.1 算术运算符与算术表达式加减运算符加减运算符 ,是二目运算符,即连接两个操作元的运算符。加减运算符的结合方向是从左到右。例如2 38,先计算2 3,然后再将得到的结果减8。加减运算符的操作元是整型或浮点型数据,加减运算符的优先级是4级。乘、除和求余运算符乘、除和求余运算符*、、%是二目运算符,结合方向是从左到右,例如2*38,先计算2*3,然后再将得到的结果除以8。乘,除和求余运算符的操作元是整型或浮点型数据,*、、%运算符的优先级是3级。用算术运算符和括号连接起来的符合Java语法规则的式子,称为算术表达式。如x 2*y30 3*y 5。3.1.2 自增、自减运算符自增、自减运算符、?是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量,作用是使变量的值增1或减1,例如:x(?x)表示在使用x之前,先使x的值增(减)1。x(x?)表示在使用x之后,使x的值增(减)1。粗略地看,x和x的作用相当于x = x 1。但x和x的不同之处在于,x是先执行x = x 1再使用x的值,而x是先使用x的值再执行x = x 1。如果x的原值是5,则对于y = x;,y的值为6,对于y = x;,y的值为5。3.1.3 算术混合运算的精度精度从低到高排列的顺序是:byte short char int long float double。Java在计算算术表达式的值时,使用下列运算精度规则:(1)如果表达式中有双精度浮点数(double型数据),则按双精度进行运算。例如,表达式5.02 10的结果12.5是double型数据。(2)如果表达式中最高精度是单精度浮点数(float型数据),则按单精度进行运算。例如,表达式5.0F2 10的结果12.5是float型数据。(3)如果表达式中最高精度是long型整数,则按long精度进行运算。例如,表达式12L 100 ''a''的结果209是long型数据。(4)如果表达式中最高精度低于int型整数,则按int精度进行运算。例如,表达式byte10 ''a''和52的结果分别为107和2,都是int型数据。Java允许把不超出byte、short和char的取值范围的算术表达式的值赋给byte、short和char型变量。例如,byte30 ''a''是结果为127的int型常量,byte x =byte20 ''a'';是正确的,但byte x=byte30 ''b'';却无法通过编译,编译错误是可能损失精度,找到int需要byte,其原因是byte30 ''b''的结果是int型常量,其值超出了byte变量的取值范围(见上面关于运算精度的讲述(4))。3.1.4 关系运算符与关系表达式关系运算符是二目运算符,用来比较两个值的关系。关系运算符的运算结果是boolean型,当运算符对应的关系成立时,运算结果是true,否则是false。例如,101的结果是true,3!=5的结果是true,102017的结果为true,因为算术运算符的级别高于关系运算符,102017相当于10(2017),其结果是true。结果为数值型的变量或表达式可以通过关系运算符(如表3.1所示)形成关系表达式。例如48,x y80等。表3.1 关系运算符运算符优先级用法含义结合方向=op2op1=op2op18&&92的结果为false,28||92的结果为true。由于关系运算符的级别高于&&、||的级别,28&&82相当于(28)&&(92)。逻辑运算符&&和||也称作短路逻辑运算符,这是因为当op1的值是false时,&&运算符在进行运算时不再去计算op2的值,直接就得出op1&&op2的结果是false;当op1的值是true时,||运算符在进行运算时不再去计算op2的值,直接就得出op1||op2的结果是true。3.1.6 赋值运算符与赋值表达式赋值运算符=是二目运算符,左面的操作元必须是变量,不能是常量或表达式。设x是一个整型变量,y是一个boolean型变量,x = 20和y = true都是正确的赋值表达式,赋值运算符的优先级较低,是14级,结合方向是从右到左。赋值表达式的值就是=左面变量的值。例如,假如a、b是两个int型变量,那么表达式b = 12和a = b = 100的值分别是12和100。注意不要将赋值运算符=与等号关系运算符==混淆,例如,12 = 12是非法的表达式,而表达式12 == 12的值是true。3.1.7 位运算符整型数据在内存中以二进制的形式表示,例如一个int型变量在内存中占4个字节共32位,int型数据7的二进制表示是:00000000 00000000 00000000 00000111左面最高位是符号位,最高位是0表示正数,是1表示负数。负数采用补码表示,例如8的补码表示是:111111111 111111111 1111111 11111000这样就可以对两个整型数据实施位运算,即对两个整型数据对应的位进行运算得到一个新的整型数据。按位与运算按位与运算符&是双目运算符,对两个整型数据a、b按位进行运算,运算结果是一个整型数据c。运算法则是:如果a、b两个数据对应位都是1,则c的该位是1,否则是0。如果b的精度高于a,那么结果c的精度和b相同。例如:a:00000000 00000000 00000000 00000111& b:10000001 10100101 11110011 10101011c:00000000 00000000 00000000 00000011按位或运算按位或运算符|是二目运算符,对两个整型数据a、b按位进行运算,运算结果是一个整型数据c。运算法则是:如果a、b两个数据对应位都是0,则c的该位是0,否则是1。如果b的精度高于a,那么结果c的精度和b相同。按位非运算按位非运算符~是单目运算符,对一个整型数据a按位进行运算,运算结果是一个整型数据c。运算法则是:如果a对应位是0,则c的该位是1,否则是0。按位异或运算按位异或运算符^是二目运算符,对两个整型数据a、b按位进行运算,运算结果是一个整型数据c。运算法则是:如果a、b两个数据对应位相同,则c的该位是0,否则是1。如果b的精度高于a,那么结果c的精度和b相同。由异或运算法则可知:a^a=0,a^0=a。因此,如果c=a^b,那么a=c^b,也就是说,^的逆运算仍然是^,即a^b^b等于a。位运算符也可以操作逻辑型数据,法则是:当a、b都是true时,a&b是true,否则a&b是false。当a、b都是false时,a|b是false,否则a|b是true。当a是true时,~a是false;当a是false时,~a是true。位运算符在操作逻辑型数据时,与逻辑运算符&&、||、!不同的是:位运算符要计算完a和b的值之后再给出运算的结果。例如,x的初值是1,那么经过下列逻辑比较运算后,y=1==0&&x=6==6;x的值仍然是1,但是如果经过下列位运算之后,y=1==0&x=6==6;x的值将是6。在下面的例子1中,利用异或运算的性质,对几个字符进行加密并输出密文,然后再解密,运行效果如图3.1所示。例子1Example3_1.javapublic class Example3_1 {public static void mainString args[] { char a1 = ''十'',a2 = ''点'',a3 = ''进'',a4 = ''攻''; char secret = ''A''; a1 = chara1^secret;a2 = chara2^secret; a3 = chara3^secret;a4 = chara4^secret; System.out.println"密文:" a1 a2 a3 a4; a1 = chara1^secret;a2 = chara2^secret; a3 = chara3^secret;a4 = chara4^secret; System.out.println"原文:" a1 a2 a3 a4;}}3.1.8 instanceof运算符该运算符是二目运算符,左面的操作元是一个对象,右面是一个类。当左面的对象是右面的类或子类创建的对象时,该运算符运算的结果是true,否则是false(有关细节详见 5.3.2节)。3.1.9 运算符综述Java表达式就是用运算符连接起来的符合Java规则的式子。运算符的优先级决定了表达式中运算执行的先后顺序。例如,x 左到右6大小关系运算 =左到右7相等关系运算== !=左到右8按位与运算&左到右9按位异或运算^左到右10按位或|左到右11逻辑与运算&&左到右12逻辑或运算||左到右13三目条件运算? :左到右14赋值运算=右到左3.2 语句概述Java里的语句可分为以下6类。方法调用语句如:System.out.println"Hello";表达式语句由一个表达式构成一个语句,即表达式尾加上分号。例如赋值语句:x = 23;复合语句可以用{ }把一些语句括起来构成复合语句,例如:{z = 123 x;System.out.println"How are you";}空语句一个分号也是一条语句,称作空语句。控制语句控制语句分为条件分支语句、开关语句和循环语句,将在后面的3.3~3.5节介绍。package语句和import语句package语句和import语句与类、对象有关,将在第4章讲解。3.3 if条件分支语句条件分支语句按语法格式可细分为三种形式,以下是这三种形式的详细讲解。3.3.1 if语句if语句是单条件单分支语句,即根据一个条件来控制程序执行的流程。if语句的语法格式:if表达式{ 若干语句}if语句的流程图如图3.2所示。在if语句中,关键字if后面的一对小括号内的表达式的值必须是boolean类型,当值为true时,则执行紧跟着的复合语句,结束当前if语句的执行;如果表达式的值为false,结束当前if语句的执行。需要注意的是,在if语句中,其中的复合语句中如果只有一条语句,{}可以省略不写,但为了增强程序的可读性最好不要省略(这是一个很好的编程风格)。在下面的例子2中,将变量a、b、c中的数值按大小顺序进行互换(从小到大排列)。例子2Example3_2.javapublic class Example3_2 {public static void mainString args[] { int a = 9,b = 5,c = 7,t=0; ifb0 y=10; z=20;else y=-100;正确的写法是:ifx0{ y=10;z=20;}else y=100;需要注意的是,在if-else语句中,其中的复合语句中如果只有一条语句,{}可以省略不写,但为了增强程序的可读性最好不要省略(这是一个很好的编程风格)。例子3中有两条if-else语句,其作用是根据成绩输出相应的信息,运行效果如图3.4所示。例子3Example3_3.javapublic class Example3_3 {public static void mainString args[] {int math = 65 ,english = 85;ifmath60 {System.out.println"数学及格了";}else {System.out.println"数学不及格";}ifenglish90 {System.out.println"英语是优";}else {System.out.println"英语不是优";}System.out.println"我在学习if-else语句";}}3.3.3 if-else if-else语句if-else if-else语句是多条件分支语句,即根据多个条件来控制程序执行的流程。if-else if-else语句的语法格式:if表达式 {若干语句}else if表达式 {若干语句}else {若干语句}if-else if-else语句的流程图如图3.5所示。在if-else if-else语句中,if以及多个else if后面的一对小括号内的表达式的值必须是boolean类型。程序执行if-else if-else时,按该语句中表达式的顺序,首先计算第1个表达式的值,如果计算结果为true,则执行紧跟着的复合语句,结束当前if-else if-else语句的执行,如果计算结果为false,则继续计算第2个表达式的值,依次类推,假设计算第m个表达式的值为true,则执行紧跟着的复合语句,结束当前if-else if-else语句的执行,否则继续计算第m 1个表达式的值,如果所有表达式的值都为false,则执行关键字else后面的复合语句,结束当前if-else if-else语句的执行。
图3.5 if-else if-else多条件、多分支语句if-else if-else语句中的else部分是可选项,如果没有else部分,当所有表达式的值都为false时,结束当前if-else if-else语句的执行(该语句什么都没有做)。需要注意的是,在if-else if-else语句中,其中的复合语句中如果只有一条语句,{}可以省略不写,但为了增强程序的可读性最好不要省略。3.4 switch开关语句switch语句是单条件多分支的开关语句,它的一般格式定义如下(其中break语句是可选的)。switch表达式{case 常量值1:若干个语句break;case 常量值2:若干个语句break;case 常量值n: 若干个语句 break;default: 若干语句}switch语句中表达式的值可以为byte、short、int、char型;常量值1到常量值n也是byte、short、int、char型,而且要互不相同。switch语句首先计算表达式的值,如果表达式的值和某个case后面的常量值相等,就执行该case里的若干个语句直到碰到break语句为止。如果某个case中没有使用break语句,一旦表达式的值和该case 后面的常量值相等,程序不仅执行该case里的若干个语句,而且继续执行后继的case里的若干个语句,直到碰到break语句为止。若switch语句中的表达式的值不与任何case的常量值相等,则执行default后面的若干个语句。switch语句中的default是可选的,如果它不存在,并且switch语句中表达式的值不与任何case的常量值相等,那么switch语句就不会进行任何处理。前面学习的分支语句(if语句、if-else语句和if-else if-else语句)的共同特点是根据一个条件选择执行一个分支操作,而不是选择执行多个分支操作。在switch语句中,通过合理地使用break语句,可以达到根据一个条件选择执行一个分支操作(一个case)或多个分支操作(多个case)的结果。下面的例子4使用了switch语句判断用户从键盘输入的正整数是否为中奖号码。例子4Example3_4.javaimport java.util.Scanner;public class Example3_4{public static void mainString args[] { int number = 0; System.out.println"输入正整数回车确定"; Scanner reader = new ScannerSystem.in; number = reader.nextInt; switchnumber {case 9 :case 131 :case 12 : System.out.printlnnumber "是三等奖"; break;case 209 :case 596 :case 27 : System.out.printlnnumber "是二等奖";break;case 875 :case 316 :case 59 : System.out.printlnnumber "是一等奖";break;default:System.out.printlnnumber "未中奖"; }}}需要强调的是,switch语句中表达式的值可以是byte、short、int、char型,但不可以是long型数据。如果将例子4中的int number = 0;更改为long number = 0;将导致编译错误。3.5 循环语句循环语句是根据条件,要求程序反复执行某些操作,直到程序满意为止。3.5.1 for循环语句for语句的语法格式:for 表达式1; 表达式2; 表达式3 {若干语句}for语句由关键字for、一对小括号中用分号分割的三个表达式,以及一个复合语句组成,其中的表达式2必须是一个求值为boolean型数据的表达式,而复合语句称作循环体。循环体只有一条语句时,大括号{}可以省略,但最好不要省略,以便增加程序的可读性。表达式1负责完成变量的初始化;表达式2是值为boolean型的表达式,称为循环条件;表达式3用来修整变量,改变循环条件。for语句的执行规则是:(1)计算表达式1,完成必要的初始化工作。(2)判断表达式2的值,若表达式2的值为true,则进行(3),否则进行(4)。(3)执行循环体,然后计算表达式3,以便改变循环条件,进行(2)。(4)结束for语句的执行。for语句执行流程如图3.6所示。下面的例子5计算8 88 888 8888 的前12项和。例子5Example3_5.javapublic class Example3_5 {public static void mainString args[] { long sum = 0,a = 8,item = a,n = 12,i = 1; fori=1;ij2 {System.out.println"" j "是素数"; }} }}3.7 for语句与数组JDK 1.5对for语句的功能给予扩充、增强,以便更好地遍历数组。语法格式如下:for声明循环变量:数组的名字 {}其中,声明的循环变量的类型必须和数组的类型相同。这种形式的for语句类似自然语言中的for each语句,为了便于理解上述for语句,可以将这种形式的for语句翻译成对于循环变量依次取数组的每一个元素的值。下面的例子8分别使用for语句的传统方式和改进方式遍历数组。例子8Example3_8.javapublic class Example3_8 {public static void mainString args[] { int a[] = {1,2,3,4}; char b[] = {''a'',''b'',''c'',''d''}; forint n=0;n0B.m0C.m = 0D.m100&&truepublic class E { public static void main String args[ ] { int m=10,n=0; while【代码】 { n; } }}(3)假设有int x=1;,以下哪个代码导致可能损失精度,找到int需要char这样的编译错误?A.short t=12 ''a''; B.char c =''a'' 1;C.char m =''a'' x; D.byte n =''a'' 1;3.阅读程序(1)下列程序的输出结果是什么?public class E { public static void main String args[ ]{char x=''你'',y=''e'',z=''吃'';ifx''A''{y=''苹'';z=''果'';}else y=''酸'';z=''甜'';System.out.printlnx "," y "," z;}}(2)下列程序的输出结果是什么?public class E { public static void main String args[ ] {char c = ''\0'';forint i=1;i0 { x--; } System.out.print"x=" x ",y=" y;}}4.编程题(1)编写应用程序求1! 2! 10!。(2)编写一个应用程序求100以内的全部素数。(3)分别用do-while和for循环计算1 12! 13! 14! 的前20项和。(4)一个数如果恰好等于它的因子之和,这个数就称为完数。编写应用程序求1000之内的所有完数。(5)编写应用程序,使用for循环语句计算8 88 888 前10项之和。(6)编写应用程序,输出满足1 2 3 n
|
|