描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302496243丛书名: 高等院校信息技术规划教材
本书讲解Java程序设计的相关知识及其编程方法,包括Java语言编程基础、类与对象、继承与多态、异常处理、组件及事件响应、常见类的使用和I/O流、数据库、多线程和Java网络编程等。
本书的章节编排与内容以人们学习与认知的过程为基础,注重内容的可读性和可用性,与实际需求相匹配。内容力求简明,许多例题都经过精心设计,既能帮助读者理解知识,又具有启发性;每章都包含了图、表、例题以及类和接口的说明,使读者在轻松和愉快的学习中迅速理解与掌握Java程序设计的知识和方法,并应用到实践中去。
全书共分11章: 第1~7章着重介绍Java语言的语法及常见类的使用;第8章着重介绍如何通过JDBC去连接和操作数据库;第9、10章介绍如何运用多线程及其在网络编程上的应用;第11章介绍相关实验目的、实验内容及步骤。全书提供了大量的应用实例,每章的*后均附有习题供读者思考与练习。
本书既可以作为高等院校各专业的基础教材,也可以作为使用Java的工程技术人员和科技工作者的自学参考书。
第1章绪论1
1.1Java语言简介1
1.1.1Java语言平台无关性1
1.1.2Java语言的发展历史3
1.1.3Java语言的应用领域4
1.1.4Java语言的地位6
1.2Java语言的特性7
1.3Java编程规范9
1.3.1包的命名与注释10
1.3.2类、接口的命名及注释10
1.3.3成员函数的命名及注释12
1.3.4字段、属性的命名及注释14
1.3.5局部变量命名及注释15
1.4Java开发环境的搭建16
1.4.1下载JDK16
1.4.2安装JDK17
1.4.3配置环境变量17
1.5第一个程序Hello World!21
1.6Eclipse开发工具的安装与使用24
1.6.1Eclipse下载及安装24
1.6.2Eclipse的配置及启动25
1.6.3创建Java项目26
1.6.4创建类文件27
1.6.5输出Eclipse中的第一个Hello
World!31
1.7本章小结32
习题132◆Java程序设计目录第2章Java语言编程基础33
2.1基本数据类型及转换33
2.1.1整数类型33
2.1.2字符类型35
2.1.3浮点类型35
2.1.4逻辑类型36
2.1.5类型转换运算36
2.2变量与常量37
2.2.1变量37
2.2.2常量38
2.3运算符和字符串39
2.3.1运算符39
2.3.2字符串41
2.4表达式和语句44
2.4.1表达式44
2.4.2语句44
2.4.3if条件分支语句45
2.4.4switch开关语句47
2.4.5循环语句48
2.4.6break和continue语句50
2.5流程控制51
2.5.1块作用域51
2.5.2条件语句52
2.5.3循环语句52
2.5.4多重选择switch语句53
2.5.5中断控制流程语句53
2.6数组和数组列表55
2.6.1使用数组55
2.6.2构造数组55
2.6.3数组列表56
2.6.4数组与数组列表的复制58
2.7标准输入和输出58
2.7.1读取输入58
2.7.2格式化输出59
2.8本章小结60
习题261
第3章类与对象63
3.1面向对象概述63
3.2类64
3.2.1类的定义64
3.2.2类的声明64
3.3对象的创建和构造方法65
3.3.1对象的声明与创建65
3.3.2使用对象66
3.3.3构造方法68
3.4对象的组合69
3.5类的高级特性72
3.5.1Java类包72
3.5.2包名冲突72
3.5.3完整的类路径73
3.5.4创建包73
3.5.5成员内部类74
3.5.6局部内部类76
3.5.7静态内部类77
3.5.8匿名内部类78
3.6static关键字80
3.6.1实例变量和类变量的区别80
3.6.2实例方法和类方法的区别81
3.7this关键字82
3.7.1在构造方法中使用this82
3.7.2在实例方法中使用this83
3.8基本数据类型的封装类85
3.8.1Double和Float类85
3.8.2Byte、Short、Integer和Long类85
3.8.3Character类85
3.8.4有理数的封装86
3.8.5自动装箱与拆箱89
3.9本章小结90
习题390
第4章继承与多态92
4.1类的继承92
4.1.1继承的好处92
4.1.2继承的定义92
4.1.3继承的用法93
4.1.4继承总结95
4.2多态95
4.2.1多态的定义95
4.2.2多态的理解95
4.3抽象类99
4.3.1抽象类的定义99
4.3.2继承抽象类102
4.3.3抽象方法103
4.3.4抽象类总结104
4.4final和super关键字104
4.4.1final关键字104
4.4.2super关键字105
4.5内部类107
4.5.1成员内部类107
4.5.2局部内部类108
4.5.3嵌套内部类110
4.5.4匿名内部类110
4.5.5内部类的继承114
4.6接口114
4.6.1接口与类115
4.6.2接口的特性115
4.6.3抽象类和接口的区别116
4.6.4接口的声明116
4.6.5接口的实现116
4.6.6接口的继承117
4.7接口回调118
4.8本章小结120
习题4120
第5章异常处理126
5.1异常处理的概念126
5.2异常类及异常处理方式126
5.2.1异常类127
5.2.2异常处理方式128
5.3捕获异常131
5.4声明异常134
5.5Java异常处理机制136
5.5.1异常处理机制136
5.5.2trycatch语句137
5.5.3trycatchfinally语句140
5.5.4try、catch、finally语句块的执行顺序142
5.5.5throws抛出异常143
5.5.6throw抛出异常144
5.6自定义异常类145
5.7异常处理的使用原则146
5.8本章小结149
习题5149
第6章组件及事件响应153
6.1Swing概述153
6.1.1JFrame窗口类153
6.1.2JPanel面板类155
6.1.3JLabel标签类156
6.1.4JButton按钮类157
6.2Swing中的事件159
6.2.1事件简介159
6.2.2同一个事件源注册多个监听器160
6.2.3同一个监听器注册给多个事件源161
6.2.4窗体获取和失去焦点事件163
6.2.5窗体打开、关闭和激活事件164
6.3常用组件及布局166
6.3.1流布局166
6.3.2网格布局168
6.3.3边框布局169
6.3.4空布局171
6.3.5卡片布局173
6.3.6文本框及密码框和多行文本框175
6.3.7复选框和单选按钮178
6.3.8选项卡180
6.3.9分隔窗格183
6.3.10滑块和进度条185
6.3.11列表框190
6.3.12菜单195
6.4本章小结197
习题6198
第7章常见类的使用和I/O流199
7.1String类和StringBuffer类199
7.1.1String类199
7.1.2StringBuffer类202
7.2Scanner类204
7.3Class类205
7.3.1Class类原理206
7.3.2获得一个Class206
7.4I/O流207
7.4.1I/O流的概念207
7.4.2预定义的I/O流类207
7.4.3文件读写210
7.4.4写二进制文件214
7.4.5读二进制文件216
7.4.6File类218
7.4.7处理压缩文件219
7.5序列化222
7.5.1基本概念与Serializable接口222
7.5.2Externalizable223
7.6本章小结224
习题7224
第8章数据库226
8.1数据库基础226
8.1.1数据库简介226
8.1.2SQL基本类型228
8.1.3SQL语法基础228
8.1.4MySQL数据库的安装及配置231
8.2JDBC概述240
8.2.1JDBC简介240
8.2.2JDBC常用类240
8.3数据库操作242
8.3.1加载驱动242
8.3.2创建数据库的连接242
8.3.3创建一个Statement242
8.3.4执行SQL语句243
8.3.5处理结果243
8.3.6数据库的关闭244
8.4本章小结249
习题8249
第9章多线程252
9.1线程基本概述252
9.1.1线程的概念252
9.1.2多线程的好处253
9.2线程的开始启动253
9.2.1继承Thread类创建线程类254
9.2.2显示Runnable接口创建线程类255
9.2.3使用Callable和Future创建线程257
9.2.4创建线程的3种方式对比259
9.3线程的生命历程259
9.3.1线程生命周期259
9.3.2线程死亡261
9.4控制线程262
9.4.1join线程262
9.4.2后台线程264
9.5线程同步265
9.5.1线程安全问题265
9.5.2同步代码块268
9.5.3释放同步监视器的锁定268
9.5.4死锁269
9.6线程通信271
9.7线程池及其应用276
9.8本章小结279
习题9279
第10章Java网络编程282
10.1IP和InetAddress类282
10.1.1IP和IP地址282
10.1.2InetAddress类283
10.2URL与URLConnection284
10.2.1URL284
10.2.2URLConnection286
10.3基于TCP的网络编程288
10.3.1TCP基础288
10.3.2TCP的建立与中断290
10.3.3基于TCP协议的Socket编程292
10.4基于UDP的网络编程296
10.4.1UDP基础296
10.4.2使用DatagramSocket发送、接收数据297
10.5本章小结304
习题10304
第11章实验305
11.1for循环305
11.1.1实验目的305
11.1.2实验内容及步骤305
11.2面向对象306
11.2.1实验目的306
11.2.2实验内容及步骤306
11.3继承与多态308
11.3.1实验目的308
11.3.2实验内容及步骤308
11.4异常处理310
11.4.1实验目的310
11.4.2实验内容及步骤310
11.5组件及事件响应311
11.5.1实验目的311
11.5.2实验内容及步骤311
11.6I/O314
11.6.1实验目的314
11.6.2实验内容及步骤314
11.7数据库317
11.7.1实验目的317
11.7.2实验内容及步骤317
11.8多线程320
11.8.1实验目的320
11.8.2实验内容及步骤320
11.9Java网络编程322
11.9.1实验目的322
11.9.2实验内容及步骤323
附录A习题答案326
参考文献352
作者2017年10月
异 常 处 理本章学习目标 了解异常的概念。 掌握捕获异常。 了解Java中常见的异常。 掌握自定义异常。 了解如何在方法中抛出异常。 了解运行时异常的种类。 了解异常处理的原则。本章先向读者介绍异常处理的概念,接着向读者介绍异常类及异常处理方式、捕获异常、声明异常、自定义异常,最后向读者介绍异常处理的原则。5.1异常处理的概念Java中把在程序运行时出现的一些错误称为异常。通常在程序运行时出现的错误并不是语法上的错误,而是一些不可预期的运行错误。异常是一个事件,异常发生在程序的运行期间,干扰了正常的指令流程。当程序在运行时出现错误,程序会被中断运行。开发者可以使用异常处理来加强程序的强健性和安全性,同时也可以使用异常处理来使程序更加地易于维护。异常处理虽然在程序中执行,但是并不会控制程序的正常流程,其主要目的是捕获程序在运行时发生的异常并进行相应的处理。5.2异常类及异常处理方式为了保证程序能够有效地执行,需要对发生的异常进行相应的处理。所以我们需要对异常类有一定的学习和了解,以便于当程序中出现异常时,可以采取相应的措施进行解决。◆Java程序设计第◆5章异常处理5.2.1异常类程序在运行时可能会出现各种各样的异常,所以Java提供了各种各样的异常类来帮助开发者。当我们看到种类繁多的异常类时不免会心生退意,想要放弃学习Java,但是这些异常类都有一个共同的老祖宗Throwable类,所以异常类都有一定的共性,当我们了解了这些异常类之间的联系之后,学习起来便会很简单。Throwable类是Java语言中所有错误或异常的超类,只有当对象是此类及其子类时,才能通过Java的throw和throws语句抛出,同理,也只有Throwable类及其子类才能是catch语句中的参数。Throwable类派生出了Error类和Exception类两个子类用于指示发生的异常情况。Error类和Exception类又分别派生出了其他更加具体的子类来指示更加具体的异常情况,如图5.1所示。图5.1Throwable类、Error类和Exception类及其子类的关系示意图Error类及其子类用来描述Java运行系统中的内部错误和资源耗尽的错误,这些错误通常是程序无法处理的错误,用于指示合理的应用程序不应该试图去捕获的严重问题。应用程序在运行时出现的比较严重的错误如VirtualMachineError。当这种错误出现时大多数与代码没有关系,更多的是程序运行时虚拟机出现了问题。通常Error类的错误即使没有trycatch方法捕获或者throws语句抛出,程序也会编译通过。Exception类又被称为非致命性类,通常通过异常处理之后便可继续执行程序,指出了合理的应用程序想要捕获的异常,表示程序本身可以处理的异常。通常人们捕获的就是Exception类的异常。常见的异常类如表5.1所示。表5.1常见的异常类ArithmeticException算术异常类NullPointerException空指针异常类ClassCastException类型强制转换异常NegativeArrayException数组负下标异常ArrayIndexOutOfBoundsException数组下标越界异常SecurityException违背安全原则异常EOFException文件已结束异常FileNotFoundException文件未找到异常NumberFormatException字符串转换为数字异常SQLException操作数据库异常IOException输入输出异常NoSuchMethodException方法未找到异常AbstractMethodError抽象方法错误AssertionError断言错误InternalError内部错误NoClassDefFoundError未找到类定义错误NoSuchMethodError方法不存在错误OutOfMemoryError内存不足错误StackOverFlowError堆栈溢出错误ThreadDeath线程结束UnknownError未知错误5.2.2异常处理方式在Java中当程序抛出异常时,开发者既可以在当前的方法中进行捕获然后处理该异常,也可以将异常向上抛,由调用者来处理异常,但是无论是哪种方法,均需要对捕获的异常进行处理。常用以下方法来获取异常的相关信息。getMessage(): 输出错误性质。toString(): 输出异常的类型和性质。printStackTrace(): 输出异常的类型、性质、栈层次及出现在程序中的位置。常使用throws或者throw关键字抛出异常。throws关键字: 通常被应用在声明方法时,用来指定方法可能抛出的异常,当有多个异常时可使用逗号隔开。throw关键字: 通常被应用在方法体中,并且抛出一个异常对象。但是程序在执行到throw语句时会立即终止程序,当throw抛出异常后,上一级代码若想捕获并处理异常,必须使用throws关键字在方法的声明中指明要抛出的异常。例5.1请找出下列程序中有关异常处理的6个问题。
1. 丢弃异常(代码14~17行)这段代码捕获了异常却不做任何处理(丢弃异常),可以算得上是Java编程中的杀手。从问题出现的频繁程度和祸害程度来看,它也许可以和C/C 程序的一个恶名远播的问题相提并论: 不检查缓冲区是否已满。如果看到了这种丢弃(而不是抛出)异常的情况,就可以99%地肯定代码存在的问题(在极少数情况下,这段代码有存在的理由,但最好加上完整的注释,以免引起他人误解)。解决方法:(1) 处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。需要说明的是,调用printStackTrace算不上已经处理了异常。(2) 重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也是一种处理异常的方法。(3) 把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(目的是为了更易于被用户理解)。(4) 不要捕获异常。2. 不指定具体的异常(代码14行)有些开发者会想用一个catch语句捕获所有的异常,所以会经常使用catch(Exception ex),但实际上,在绝大多数情况下,这种做法不值得提倡。回顾一下catch语句的用途: catch语句表示我们预期会出现某种异常,而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从Java.lang.Exception派生,catch(Exception ex)就相当于说我们想要处理几乎所有的异常。从前面的代码例子中可以看到,最明显的一个异常是SQLException(这是JDBC操作中常见的异常),另一个可能的异常是IOException,因为程序要操作OutPutStreamWriter。很显然,在同一个catch块中处理这两种截然不同的异常是不合适的,但是如果用两个catch块分别捕获SQLException和IOException就要好多了。这就是说,catch语句应当尽量指定具体的异常类型,而不应该指定涵盖范围太广的Exception类。除了这两个异常之外,还有其他许多异常也可能出现。当出现这种情况时,应该让它们继续抛出,既不必捕获也不必处理,最后会由JVM处理。3. 占用资源不释放(代码3~13行)如果程序用到了文件、Socket、JDBC连接之类的资源,即使遇到了异常,也要正确释放占用的资源。为此,Java提供了一个简化这类操作的关键词finally。finally的目的是不管程序是否出现了异常,都保证在trcatchfinally块结束之前,执行清理任务的代码总是有机会被执行。当然,编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常,毕竟这是执行清理任务的最后机会。4. 不说明异常的详细信息(代码3~17行)仔细观察这段代码就会发现,如果循环内部出现了异常,人们根本没有足够的信息判断循环内部出错的原因,人们只能知道当前正在处理的类发生了某种错误,但却不能获得任何信息以判断导致当前错误的原因。printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,但只提供了一些最基本的信息,未能说明实际导致错误的原因,同时也不易解读。所以,在出现异常时,最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。5. 过于庞大的try块(代码3~13行)很多开发者为了省事,不愿花时间分析一大块代码中哪几行代码会抛出异常以及异常的具体类型是什么,而是喜欢把大量的代码放入单个try块。这种做法为分析程序抛出异常的原因带来了困难,因为一大段代码中有太多的地方可能会抛出异常。所以开发者应该尽量减小try块的体积。6. 输出数据不完整(代码7~10行)不完整的数据是Java程序的隐形杀手。仔细观察这段代码就会发现,如果循环的中间抛出了异常,循环的执行就会被打断,接着,catch块会执行,之后程序便不会执行其他动作。但如果这样,那么已经输出的数据应怎么办?使用这些数据的人或设备将收到一份不完整的(也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来的损失更大。比较理想的处置办法是向输出设备写一些信息,声明数据的不完整性。另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。改正后的代码示例:
5.3捕 获 异 常对程序进行异常处理的前提是要捕获异常。Java中异常的捕获由try、catch、finally共3部分组成。本节将介绍如何正确地使用这3部分来捕获异常,为解决程序中出现的异常做好准备。try: 存放可能会发生异常的Java语句,当try中的语句出现异常时,便会跳转执行catch语句。catch(在try之后): 激发被捕获的异常。finally(异常处理最后执行的部分): 无论trycatch语句中是否捕获到了异常,程序均会执行finally语句。需要注意的是,异常处理是结构化的,不会因为一个异常的出现而影响整个程序的执行,当try程序块中的语句发生异常时会转入执行catch程序块中的语句,执行完catch程序块中的语句后便会继续向下执行。例5.2抛出异常,没有finally,当catch遇上return。try {//抛出异常,后续处理被拒绝int i=10/0;System.out.println(“i vaule is: ” i);//异常已经抛出,没有获得被执行的机会return true;}catch(Exception e){System.out.println(“–Exception–“);//异常抛出,获得了调用方法并返回方法值的机会return catchMethod();}运行结果:– Exception –call catchMethod and return –>>false例5.3抛出异常,若catch体中有return,finally体的代码块将在catch执行return之前被执行。try{//抛出异常,后续处理被拒绝int i=10/0;System.out.println(“i vaule is: ” i);//异常已经抛出,没有获得被执行的机会return true;}catch(Exception e){System.out.println(“–Exception–“);//异常抛出,获得了调用方法的机会,但方法值在finally执行完后才返回return catchMethod();}finally{//异常抛出,finally代码块将在catch执行return之前被执行finallyMethod();}运行结果:i vaule is: 5call finallyMethod and do something—>>false例5.4不抛出异常,当finally代码块中遇上System.exit()方法将结束和终止整个程序,而不只是方法。try {//不抛出异常int i=10/2;System.out.println(“i vaule is: ” i);//获得被执行的机会,但由于finally已经终止程序,返回值没有机会被返回return true;}catch(Exception e){System.out.println(“–Exception–“);return true;}finally {finallyMethod();//finally 中含有System.exit()语句,System.exit()将退出整个程序,程序将被终止System.exit(0);}运行结果:i vaule is: 5call finallyMethod and do something —>>例5.5不抛出异常,当finally代码块中遇上return,finally执行完后将结束整个方法。try{//不抛出异常int i=10/2;System.out.println(“i vaule is: ” i);//获得被执行的机会,但执行需要在finally执行完成之后才能被执行return true;}catch(Exception e){System.out.println(“–Exception–“);return catchMethod();}finally{finallyMethod();//finally中含有return语句,这个return将结束这个方法,不会在执行完之后再跳回//try或catch继续执行,方法到此结束,返回falsereturn false;}运行结果:i vaule is: 5call finallyMethod and do something —>>false例5.6抛出异常,当catch和finally同时遇上return,catch的return返回值将不会被返回,finally的return语句将结束整个方法并返回。try {//抛出异常,后续处理被拒绝int i=10/0; System.out.println(“i vaule is: ” i);//异常已经抛出,没有获得被执行的机会return true;} catch(Exception e) {System.out.println(“–Exception–“);//异常已经抛出,获得被执行的机会,但返回操作将被finally截断return true;}finally {finallyMethod();//return将结束整个方法,返回 falsereturn false;}运行结果:– Exception –call finallyMethod and do something —>>false例5.7不抛出异常,当finally遇上return,try的return返回值将不会被返回,finally的return语句将结束整个方法并返回。try {//不抛出异常int i=10/2;System.out.println(“i vaule is: ” i);//获得被执行的机会,但返回将被finally截断return true; }catch(Exception e){System.out.println(“–Exception–“);return true;}finally {finallyMethod();//return将结束这个方法,不会在执行完之后再跳回try或catch继续执行,返回falsereturn false; }运行结果:i vaule is: 5call finallyMethod and do something –>>false5.4声 明 异 常当捕获到了程序中的异常但是并不想解决时,可以声明异常而向上抛出异常。Java中用throws方法声明某个方法可能抛出的异常。Java中的声明异常即为用throws方法声明某个方法可能抛出的异常,抛出的一个具体的异常类型。throws通常不用显示捕获的异常,可由系统自动将所有捕获的异常信息抛给上级方法。例5.8以下代码中,抛出一个IllegalArgumentException类型的异常。private String id;//利用throws关键字声明该方法可能出现的异常 public void setID(String id) throws IllegalException {if(id.length()==7){this.id=id;}else { throw new IllegalArgumentException(“参数长度应为7″);} }例5.9//声明异常public class ThrowsException throws Exception {//声明catchThrowsException方法的同时指出可能出现的异常类型public void catchThrowException(int str) throws ArrayIndexOutOfBoundsException, ArithmeticException,NullPointerException {System.out.print(str ” “);if(str==1) {int a=0;int b=6/a;} else if(str==2) {String s[]=new String[5];s[0].toCharArray();} else if(str==3) {int[] a=new int[5];a[10]=10;} else {System.out.println(“没有发现异常,系统正常执行”);}}public static void main(String args[]) {ThrowsException te=new ThrowsException();try {te.catchThrowException(0);} catch(Exception e) {//捕获异常,并打印出相应的异常信息System.out.println(“异常:” e.getMessage());}try {
评论
还没有评论。