
本书不仅介绍了Java的基本语法规则,还将J2SE平台提供的功能融合进来,着重介绍在此平台上如何编写有实际用途的程序,培养学生良好的编程习惯,提高学生的工程应用能力。本书在章节组织中以快速带领读者进入工程编程领域为目标。在编程工具的选择上,介绍了目前主流且免费的开发工具:VS Code。在介绍完Java基础的语法知识之后,立即开始介绍Java中的常用工具类,包括数组、字符串、数学类、系统类等。学完这一部分,读者已经可以编写有一定实用价值的程序了。在介绍完面向对象的高级特性之后,着重介绍了在工程开发中经常会遇见的一些问题,如字符编码的转换问题、文件的内容和属性的处理问题。在多线程章节中,着重介绍了线程的互斥和同步处理方法,这也是工程编程中的难点问题。整本教材中提供了大量的编程实例,大多数问题都以程序代码来讲解,代码编写遵循工程编程规范,充分体现了“talk is cheap, show me the code”的精神。
Java?是目前流行的程序开发语言之一。作为一种完全向对象的语言,它吸取了别的编程语言的各种优点,设计简洁而优美,使用便捷而高效,是一门典型的门槛低而天花板高的语言。它既像Python?那样易于入门,又像C/C++那样具有强大的实际应用能力。而且与其他纯粹的语言不同,Java?其实是一个完整的技术平台,这也就决定了学习Java?和其他语言有一些区?别。 市面上介绍Java?的书籍很多,既包括了国外的经典名著,也包括了国内各种各样的教学书籍,但真正适合大学计算机本科专业教学的书籍却不多。对于国外名著,由于作者的思维方式总是和中国读者有一定的距离,以及存在知识背景的差异,刚入门的读者无法领略其中的精妙。而大多数的教材,则将Java?当作纯粹的语言来教学,忽视了它作为一个应用平台的强大威力,读者看了之后,难免误会Java?不过是一个精简了的C++,只是学会了一些零散的语法知识,并不能真正从事开?发工作。 作者从?2003?年开始从事本科生的Java?程序设计课程的教学工作,同时以Java?为语言工具从事商业项目开发。在教学过程中,作者发现很难找到一本真正适合本科生的Java?教材。有感于此,作者在自己平时所用课件的基础上,编写了本书。本书深入浅出、由易到难地介绍了Java?的所有语言基础知识,每个知识点都采用了以例程讲解为主、理论分析为辅的方式进行介绍。 本书不需要读者有任何的编程经验,举例时尽量避免复杂的数据结构和算法设计。每个例子都着重于Java?知识点本身,尽量浅显易懂,不涉及其他的知识。为了让读者养成良好的编程习惯,本书的程序代码均尽量按照软件工程中的规范来编写。全书配合了大量的示例程序、图例及代码说明,所有例程作者均仔细调试过,确保无错?误。 作者根据多年的Java?教学经验和工程经验,总结出Java?初学者最需要的知识及正确的学习方法,帮助读者用最少的时间获取最大的收益。本书特别适合于计算机、软件工程、网络工程专业作为教材使用,也适用于自?学。 当然由于时间仓促,作者本人水平有限,书中错误也在所难免,欢迎读者来信予以批评指?正。 1. 本书的内容安排 本书共分为?13?章,首先讲述了Java?的基本语法,然后介绍了面向对象的编程思想,再介绍Java?中的一些高级技术。随后,进入到实际编程阶段,先后介绍了GUI程序设计和网络程序设计。具体章节安排如?下。 第?1?章是入门准备,介绍Java?的运行开发环境,详细讲解了JDK的安装和配置,以及如何使用VS Code?来编辑和运行一个Java?源程?序。 第?2?章是编程初探,介绍了Java?的基础知识,包括数据类型、运算符与表达式、流程控制等。最后以几个实例来引导读者步入程序设计的大门。这一章是整个Java?程序设计的基?础。 第?3?章和第?4?章是面向对象编程初步,介绍了如何使用Java?来进行面向对象的程序设计,这包括对象和类的定义与使用、Java?的数组、字符串、常用工具类?等。 第?5?章是面向对象高级特性,包括单继承和多重继承机制、Java?的多态机制、抽象类、内部类、包的使?用。 第?6?章至第?10?章是工程编程初步,介绍了Java?编写实用程序时必不可少的一些功能,包括包和内部类、异常处理机制、文件读写、多线程的实现及网络程序设计。读者学完这几章,已经可以编写一些实用程序?了。 第?11?章至?13?章介绍了Java?中的一些高级技术,包括运行时类型识别、泛型和集合等。这些内容是编写复杂实用程序的基础。使用它们,可以大大降低编程的烦琐程度和难?度。 由于篇幅有限,本书未提供习题。作为补充,作者专门为本书建立了一个配套资源网站:http://java.myxls.cn/,内有本书配套PPT课件、本书全部的代码、考试试题、上课视频,以及作者历年搜集和撰写的一些读书和编程心得,还提供Online?Judge类型的练习题,欢迎读者使用。 2. 本书的特点 本书是根据作者多年的教学经验和软件开发经验总结出来的,涵盖了几乎所有的Java?基础知识。本书将知识范围锁定在了适合本科教学部分,以大量的实例进行示范和解说,其特点主要体现在以下几个方?面。 (1)本书的编排采用循序渐进的方式,适合初级、中级学者逐步掌握复杂的编程技?术。 (2)本书采用了大量的编程示例,讲述Java?基本知识点,并且尽量使这些示例简洁规范,让读者能专心于知识点上,而不被其他事务所干?扰。 (3)对于有特点的实例进行详细的解释和分析,帮助读者理解和模拟实?践。 (4)对于学习和编程中经常遇到的问题,需要注意的关键点予以特别提?示。 (5)对于市面上一些教材中普遍犯下的错误进行了澄?清。 (6)本书采用技术要点、详细介绍、运行效果等多种方式进行讲解,系统性强、可读性?强。 3. 致谢 本书大部分章节修改自作者的课件,其中有少部分素材来自网络,已经无法一一标明出处,特向原作者致谢;在成书过程中,不少听课的学生也提出了自己的看法和改进意见;本书受到湘潭大学?2020?年精品教材项目的资助;研究生黄浩钰、李广、马中昊、罗兵辉、焦小龙、李文桂、张思维华、陈勇和付鹏程参与了此书的文字校对和程序调试工作,在此一并表示感?谢。 由于作者水平有限,本书中的疏漏之处在所难免,欢迎读者提出宝贵意见。 作 者
第?1?章 入门准备 1.1 Java?的运行环境与虚拟机 1.2 Java?的开发环境 1.2.1 JDK的安装 1.2.2 设置系统环境变量 1.2.3 编写一个简单的Java?应用程序 1.2.4 编译命令的使用 1.2.5 解释执行命令的使用 1.3 配置VS Code?集成开发工具 第?2?章 编程初探 2.1 Java?语言概述 2.1.1 Java?语言特点 2.1.2 Java?程序的构成 2.1.3 程序文本风格 2.2 数据及类型转换 2.2.1 基本数据类型 2.2.2 常量 2.2.3 变量 2.2.4 数据类型转换 2.3 运算符与表达式 2.3.1 算术运算符和算术表达式 2.3.2 关系运算符和关系表达式 2.3.3 逻辑运算符和逻辑表达式 2.3.4 条件运算符和条件表达式 2.3.5 位运算符和位运算表达式 2.3.6 赋值运算符和赋值表达式 2.3.7 表达式的求值顺序 2.4 流程控制语句 2.4.1 顺序语句 2.4.2 分支语句 2.4.3 循环语句 2.5 控制台输入和输出 2.5.1 控制台输入类Scanner 2.5.2 格式化输出?printf 2.6 应用实例 2.6.1 求最大公约数和最小公倍数 2.6.2 Fibonacci?数列 2.6.3 拆分数字和进制转换 2.6.4 输出九九口诀表 第?3?章 面向对象入门 3.1 面向对象的基本概念 3.1.1 对象 3.1.2 类 3.1.3 消息 3.1.4 面向对象的?4?个基本特征 3.2 类与对象 3.2.1 类的声明和定义 3.2.2 对象的使用 3.3 成员变量 3.3.1 成员变量的定义 3.3.2 成员变量的访问权限 3.3.3 实例成员变量和静态成员变量 3.4 成员方法 3.4.1 方法的声明和定义 3.4.2 方法的调用 3.4.3 隐含参数?this 3.5 构造方法 3.5.1 无参数构造方法的定义和使用 3.5.2 带参数构造方法的定义和使用 3.5.3 this?关键字和构造方法的调用 3.6 静态方法 3.6.1 静态方法的声明和定义 3.6.2 静态方法和实例方法的区别 3.6.3 静态代码块 3.6.4 再论静态成员变量 3.7 main()方法和命令行参数 3.8 编程实例:学生类示例 第?4?章 常用工具类 4.1 数组 4.1.1 一维数组 4.1.2 for-each?循环 4.1.3 二维数组 4.1.4 编程实例?1:数组排序 4.1.5 编程实例?2:杨辉三角 4.2 字符串 4.2.1 String?对象 4.2.2 StringBuffer?对象 4.2.3 编程实例?3:字符串排序 4.3 Runtime?类 4.3.1 内存管理 4.3.2 执行其他程序 4.4 System?类 4.4.1 利用?currentTimeMillis()记录程序执行的时间 4.4.2 利用?exit()退出虚拟机 4.4.3 获取环境属性 4.5 Math?类 4.5.1 利用随机数求π值 4.5.2 利用三角函数求π值 4.5.3 指数和对数函数 4.5.4 取整函数 4.6 Random?类的使用 4.7 日历类 4.7.1 Date?类的使用 4.7.2 使用SimpleDateFormat?格式化输出时间 4.7.3 Calendar?类的特色 4.7.4 编程实例?4:利用GregorianCalendar?输出日历 4.7.5 JSR日期时间包 4.8 Formatter?类 4.8.1 Formatter?的简单使用 4.8.2 时间格式转换符详解 4.8.3 格式说明符语法图 4.9 类型包装器 第?5?章 面向对象高级特性 5.1 继承的基本原理 5.2 子类对父类的继承 5.3 继承机制 5.3.1 属性的隐藏 5.3.2 方法的覆盖 5.3.3 构造方法没有继承机制 5.3.4 父类变量引用子类对象 5.3.5 继承的内部处理 5.4 super?关键字 5.4.1 用?super?引用父类的成员 5.4.2 使用?super?调用父类的构造方法 5.5 接口与多重继承 5.5.1 接口的定义 5.5.2 接口的继承 5.5.3 接口的实现 5.6 重载 5.6.1 普通方法的重载 5.6.2 构造方法的重载 5.6.3 重载的解析 5.6.4 重载与覆盖的区别 5.7 运行时多态 5.7.1 实例方法的运行时多态 5.7.2 成员变量运行时的表现 5.7.3 静态方法运行时的表现 5.8 编程实例:图形类示例 第?6?章 包和特殊类 6.1 包 6.1.1 包的创建 6.1.2 包的使用 6.1.3 JAR文件的创建和使用 6.1.4 JDK中的常用包 6.2 抽象类与抽象方法 6.2.1 抽象方法的声明 6.2.2 抽象类的定义 6.2.3 抽象方法与回调函数 6.3 最终类与最终方法 6.4 内部类 6.4.1 内部类的定义 6.4.2 内部类访问外部类的成员 6.4.3 内部类之间的相互使用 6.4.4 在外部使用内部类 6.4.5 匿名内部类 6.4.6 内部类的作用 第?7?章 异常处理机制 7.1 异常机制简介 7.1.1 基本概念 7.1.2 异常处理的作用 7.1.3 Java?的异常处理机制 7.1.4 异常类的层次结构 7.2 异常处理类型 7.2.1 运行时异常 7.2.2 检查型异常 7.2.3 自定义异常 7.3 异常处理机制 7.3.1 捕获和处理异常 7.3.2 抛出异常 7.3.3 try-catch-finally?语句的嵌套 7.3.4 try-with-resource?语句 7.3.5 用户自定义异常 7.4 编程实例:使用异常机制来实现键盘输入 第?8?章 文件处理 8.1 文件和输入/输出流 8.2 字节流 8.2.1 InputStream?中的方法 8.2.2 OutputStream?中的方法 8.2.3 文件输入流FileInputStream 8.2.4 文件输出流FileOutputStream 8.2.5 编程实例?1:保存用户输入到文件 8.2.6 编程实例?2:显示文件内容 8.2.7 编程实例?3:文件的复制 8.2.8 顺序输入流 8.2.9 管道输入流 8.2.10 过滤输入/输出流 8.3 字符流 8.3.1 InputStreamReader?类中的方法 8.3.2 OutputStreamWriter?类中的方法 8.3.3 编程实例?4:保存键盘输入中文到文件 8.3.4 编程实例?5:文件编码转换 8.4 文件属性处理 8.4.1 File?类中的方法 8.4.2 编程实例?6:文件列表 8.5 随机访问文件 8.5.1 RandomAccessFile?类中的方法 8.5.2 编程实例?7:文件加密 8.6 序列化 第?9?章 多线程 9.1 线程的概念 9.1.1 多线程的特点 9.1.2 线程的状态 9.2 Thread?类 9.2.1 Thread?类的构造方法 9.2.2 Thread?类的常用方法 9.3 多线程程序的编写 9.3.1 利用Thread?的子类创建线程 9.3.2 实现Runnable?接口创建线程 9.3.3 使用?isAlive()和?join()等待子线程结束 9.3.4 设置线程优先级 9.4 线程的通信与协调 9.4.1 线程的互斥 9.4.2 线程的同步 9.4.3 暂停、恢复和停止线程 9.4.4 编程实例:生产者-消费者问题 9.5 利用Lock?接口实现线程互斥 第?10?章 网络程序设计 10.1 与网络相关的常用术语 10.2 InetAddress?类使用示例 10.2.1 编程实例?1:根据域名查找IP地址 10.3 URL类和URLConnection?类的使用 10.3.1 编程实例?2:用URL类实现一个简单的浏览器 10.3.2 编程实例?3:用URLConnection?类实现文件下载 10.4 Socket?的使用 10.4.1 客户端创建Socket?对象 10.4.2 服务器端创建ServerSocket?对象 10.4.3 编程实例?4:一对一的通信 10.4.4 编程实例?5:一对多的通信 10.4.5 编程实例?6:简单的聊天程序 10.5 UDP数据报通信 10.5.1 DatagramSocket?的使用方法 10.5.2 DatagramPacket?的使用方法 10.5.3 编程实例?7:用UDP实现的聊天程序 第?11?章* 运行时类型识别 11.1 RTTI的作用 11.2 用Class?类来加载对象 11.3 使用?getClass()方法获取类信息 11.4 使用类标记 11.5 使用关键字?instanceof?判断所属类 11.6 利用反射获取运行时类信息 11.6.1 使用?isInstance()方法判断所属类 11.6.2 获取成员方法信息 11.6.3 获取构造方法信息 11.6.4 获取类的成员属性 11.6.5 根据方法的名称来执行方法 11.6.6 创建新的对象 11.6.7 改变属性的值 11.6.8 使用数组 第?12?章* 泛型 12.1 泛型概述 12.1.1 编程实例?1:一个关于泛型的简单例子 12.1.2 编程实例?2:带两个类型参数的泛型类 12.2 泛型的基础知识 12.2.1 有界类型 12.2.2 通配符参数 12.2.3 泛型方法 12.2.4 泛型接口 12.3 泛型类的继承 12.3.1 以泛型类为父类 12.3.2 以非泛型类为父类 12.3.3 运行时类型识别 12.3.4 强制类型转换 12.3.5 继承规则 12.4 泛型的本质 12.4.1 擦拭 12.4.2 擦拭带来的错误 12.5 泛型的局限 12.5.1 不能使用基本类型 12.5.2 不能使用泛型类异常 12.5.3 不能使用泛型数组 12.5.4 不能实例化参数类型对象 第?13?章* 集合 13.1 集合接口与抽象类 13.1.1 Collection?接口 13.1.2 Iterator?接口 13.1.3 AbstractCollection?抽象类 13.1.4 几个常用术语 13.2 集合类的使用 13.2.1 顺序表(ArrayList)使用示例 13.2.2 链表(LinkedList)使用示例 13.2.3 优先队列(PriorityQueue)使用示例 13.2.4 哈希集合(HashSet)使用示例 13.2.5 哈希映射类(HashMap)使用示例 13.2.6 有序树(TreeSet)使用示例 13.2.7 有序树映射类(TreeMap)使用示例 13.3 常用算法 13.3.1 Collections?中的简单算法 13.3.2 排序 13.3.3 二分查找 13.4 遗留的类和接口 13.4.1 Enumeration?接口简介 13.4.2 向量类(Vector)简介 13.4.3 栈(Stack)使用示例 13.4.4 字典(Dictionary)简介 13.4.5 哈希表(Hashtable)简介