Java完全自学教程
ISBN:978-7-115-56239-7
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 明日科技
责任编辑 赵祥妮
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书从零基础用户自学Java语言的角度出发,通过通俗易懂的语言、精彩有趣的实例介绍使用Java语言进行程序设计需要掌握的知识。全书共18章,分为4篇。其中基础篇介绍数据类型、运算符等,提高篇介绍数组、面向对象编程、异常处理等,高级篇介绍Swing程序设计、线程等,项目篇介绍如何设计一个开发计划管理系统。本书结合具体实例讲解知识,代码有详细注释,使读者轻松领会Java程序设计的精髓,快速提高程序设计水平。
本书适合作为Java初学者、初级和中级程序员的自学用书,通过本书读者可以全面掌握Java语言,并学会使用Java来解决问题、开发项目;本书也适合作为大中专院校相关专业、软件开发培训机构的教材或参考用书。
Java语言是通俗易懂的,它的语法与C语言和C++语言的很接近,这成为很多C语言和C++语言程序员选择学习并且使用Java语言的主要原因。Java语言提供类、接口和继承等面向对象的特性。为了简单起见,Java语言对这些面向对象的特性进行了设置,使得它们在使用时有规矩可循。此外,Java语言还能够同时执行多个线程,并提供线程与线程之间的同步机制。综上所述,Java语言是简单的,是面向对象的,是多线程的,让我们阅读这本书走进Java的世界。
本书共分18章,包括Java语言基础、窗体设计开发、文件操作、线程和网络通信、数据库操作以及项目案例讲解等。具体内容分别为:搭建Java开发环境,走进Java,数据类型,运算符,流程控制语句,数组,面向对象编程,异常的捕获与处理,字符串,Java常用类,泛型类与集合类,Swing程序设计,AWT绘图,输入/输出流,线程,网络通信,使用JDBC操作数据库和开发计划管理系统。
为方便读者自学本书,本书资源包中提供了全程的视频讲解课程,另外还包括所有项目和实例的源代码,帮助读者轻松学习Java编程。
结构合理,符合自学要求
所讲内容既避开了艰涩难懂的理论知识,又覆盖了编程所需的各方面技术,其中一些知识是同类书鲜有提及,但又非常实用的。对于目前的热点技术与应用,本书也进行了介绍。
循序渐进,轻松上手
本书内容的讲解从零起步,循序渐进,可全面提高读者的学、练、用能力。讲解中使用了大量生动、实用的实例,可以使读者轻松上手,快速掌握所学内容。
实例经典,贴近实际
本书介绍的内容和实例多数来源于实际开发,实践性非常强,也非常经典,只需做少量修改甚至不做修改,即可用于实际项目开发。本书后面部分通过一个完整的综合项目,全面介绍窗体项目开发的业务流程和技术要求,案例讲解力求步骤详尽、清晰流畅。所选实例突出实用性,注重培养读者利用Java解决实际问题的能力。
学练结合,巩固知识
本书每章后面都设置了“动手练一练”模块,可帮助读者巩固本章所学的理论知识,提升动手编程能力。
初学编程的自学者
编程爱好者
大中专院校的老师和学生
相关培训机构的老师和学员
做毕业设计的学生
初中级程序开发人员
各级程序维护及管理人员
参加实习的菜鸟程序员
本书由明日科技Java团队组织编写,参加编写的有王小科、高春艳、赛奎春、王国辉、申小琦、赵宁、何平、张鑫、周佳星、李菁菁、李磊、冯春龙、庞凤、谭畅、刘媛媛、胡冬、宋磊、张宝华、杨柳等。由于编者水平有限,错漏之处在所难免,请广大读者批评指正。
如果读者在使用本书时遇到问题,可以访问明日科技网站,我们将通过该网站全面为读者提供网上服务和支持。读者使用本书发现的错误和遇到的问题,我们承诺在1~5个工作日内给您提供回复。
服务网站:www.mingrisoft.com
服务邮箱:mingrisoft@mingrisoft.com
服务电话:0431-84978981/84978982
服务QQ:4006751066
祝您读书愉快!
明日科技
2021年12月
第1章 搭建Java开发环境
第2章 走进Java
第3章 数据类型
第4章 运算符
第5章 流程控制语句
视频教学:29分钟
“兵马未动,粮草先行。”在学习Java之前,需要先做好准备工作。本章首先介绍Java的特点,然后分别介绍如何在Windows10操作系统下安装、配置和测试已下载好的JDK11,接着分别介绍如何下载、配置和使用Eclipse,最后介绍Java API及其使用方法。
扫码看视频
Java是一门简单易用、安全可靠的计算机语言。计算机语言是指人与计算机沟通时采用的语言。Java是1995年由Sun公司推出的一门极富创造力的计算机语言,由具有“Java之父”之称的詹姆斯·高斯林设计而成。Java自诞生以来,经过不断的发展和优化,一直流行至今。
Java语言当下有两个常用版本:Java SE和Java EE,如图1.1所示。其中,Java SE是Java EE的基础,用于桌面应用程序的开发;而Java EE用于Web应用程序的开发,Web应用程序指的是用户使用浏览器即可访问的应用程序。
图1.1 Java的两个常用版本
Java语言很简单。一方面,Java语言的语法与C语言和C++语言很相近,这使得学习过C语言或C++语言的开发人员能够很容易地学习并使用Java语言;另一方面,Java语言丢弃了C++语言中很难理解的指针,并提供了自动的垃圾回收机制,即当CPU空闲或内存不足时,自动进行垃圾回收,这使得开发人员不必为内存不足而担忧。
Java语言的一个主要特点是具有跨平台性。跨平台性是指同一个Java应用程序能够在不同的操作系统上被执行。在Windows操作系统、Linux操作系统和macOS操作系统上分别安装与各个操作系统相匹配的Java虚拟机后,同一个Java应用程序就能够在这3个不同的操作系统上被执行,如图1.2所示。
说明
Java虚拟机,简称JVM(Java Virtual Machine)。如果某个操作系统安装了与之匹配的Java虚拟机,那么在这个操作系统上,Java应用程序就能够被执行。
图1.2 Java语言的跨平台性
使用Java编写应用程序既能缩短开发时间,又能降低开发成本,这使得Java的用途不胜枚举。例如,Java可以用于桌面应用程序、电子商务系统、多媒体系统、分布式系统及Web应用程序等的开发。在揭开Java的神秘面纱之前,先来做一些准备工作。
本书将使用Eclipse编写Java应用程序,但前提是必须安装JDK,因为Eclipse和JDK是相辅相成的,下面将分别予以介绍。
(1)JDK的英文全称为Java Development Kit,即Java软件开发工具包。因为JDK提供了Java的开发环境和运行环境,所以JDK是Java应用程序的基础。换言之,所有的Java应用程序都是构建在JDK上的。
说明
Java运行环境,简称JRE(Java Runtime Environment)。Java运行环境主要包含JVM和Java函数库。JDK、JRE、JVM和Java函数库的关系如图1.3所示。
图1.3 JDK、JRE、JVM和Java函数库的关系
(2)Eclipse是开发Java应用程序的众多开发工具中的一种,但不是必需的。例如,开发人员还可以使用记事本、MyEclipse、IntelliJ IDEA等开发工具编写Java应用程序。
扫码看视频
本书使用的JDK版本是Java SE 11。Java SE 11需要在OpenJDK上进行下载。
下面介绍下载Java SE 11的方法,具体步骤如下。
(1)打开浏览器,进入JDK Java的官网,打开图1.4所示的OpenJDK主页面。OpenJDK主页面展示着JDK的各个版本号。因为本书使用的是Java SE 11,所以单击图1.4所示页面中的超链接11,即可进入Java SE 11详情页。
图1.4 OpenJDK主页面
(2)在图1.5所示的Java SE 11详情页中找到并单击超链接“Windows/x64 Java Development Kit”,弹出新建下载任务对话框。
图1.5 Java SE 11详情页
(3)在图1.6所示的新建下载任务对话框中,先单击浏览按钮,选择openjdk-11+28_windows- x64_bin.zip的保存位置,再单击下载按钮。
图1.6 “新建下载任务”对话框
说明
笔者将压缩包下载到了桌面上。建议读者朋友也先将压缩包下载到桌面上,便于后续操作。
在配置Java SE 11之前,要先移动并解压openjdk-11+28_windows-x64_bin.zip,步骤如下。
(1)在D盘下新建一个空的、名为Java的文件夹,如图1.7所示。
图1.7 新建一个空的、名为Java的文件夹
(2)先单击桌面上已下载完成的openjdk-11+28_windows-x64_bin.zip,按快捷键<Ctrl + X>将其剪切;再双击打开D盘下已新建好的、名为Java的文件夹,按快捷键<Ctrl + V>将openjdk-11+28_windows-x64_bin.zip粘贴到Java文件夹下;最后对openjdk-11+28_windows-x64_bin.zip执行“解压到当前文件夹”操作,解压后的效果如图1.8所示。
图1.8 移动并解压openjdk-11+28_windows-x64_bin.zip
移动并解压openjdk-11+28_windows-x64_bin.zip后,即可对Java SE 11进行配置。在Windows10的64位操作系统下配置Java SE 11的步骤如下。
(1)右击桌面上的此电脑图标,找到并选择快捷菜单中的属性选项,如图1.9所示。
图1.9 找到并选择快捷菜单中的属性选项
(2)弹出图1.10所示的界面后,找到并单击高级系统设置。
图1.10 找到并单击高级系统设置
(3)弹出图1.11所示的系统属性对话框后,单击环境变量按钮。
图1.11 单击环境变量按钮
(4)弹出图1.12所示的环境变量对话框后,单击对话框下方的新建按钮,创建新的环境变量。
图1.12 单击对话框下方的新建按钮
(5)弹出图1.13所示的新建系统变量对话框,在对话框中输入变量名和变量值后单击确定按钮。变量名和变量值的设置具体如下。
图1.13 在对话框中输入变量名和变量值
变量名:JAVA_HOME。
变量值:D:\Java\jdk-11(图1.14所示是笔者将openjdk-11+28_windows-x64_bin.zip解压后,jdk-11文件夹中的内容)。
图1.14 jdk-11文件夹中的内容
(6)弹出图1.12所示的环境变量对话框后,在“系统变量”选项组中找到并单击Path变量,单击对话框下方的编辑按钮,如图1.15所示。
图1.15 找到并单击Path变量后单击编辑按钮
(7)弹出图1.16所示的编辑环境变量对话框后,单击对话框右侧的新建按钮。
图1.16 单击对话框右侧的“新建”按钮
(8)单击新建按钮后,在列表中会增加一个空行。在空行中输入%JAVA_HOME%\bin,如图1.17所示。
图1.17 输入%JAVA_HOME%\bin
(9)填写完毕后,先单击上移按钮,将%JAVA_HOME%\bin上移至列表的第一行;再单击确定按钮,如图1.18所示。
图1.18 将%JAVA_HOME%\bin上移至列表的第一行
完成上述步骤,即可成功配置Java SE 11。最后,依次单击各个对话框下方的确定按钮,关闭各个对话框。
Java SE 11配置完成后,需测试Java SE 11是否配置准确。测试Java SE 11的步骤如下。
(1)在Windows 10操作系统下测试JDK环境时需要先单击桌面左下角的图标,再直接输入cmd,接着按〈Enter〉键,启动命令提示符窗口。输入cmd后的效果如图1.19所示。
图1.19 输入cmd后的效果
(2)在已经启动的命令提示符窗口中输入javac,按〈Enter〉键,将输出图1.20所示的JDK的编译器信息,其中包括修改命令的语法和参数选项等信息。这说明JDK环境搭建成功。
图1.20 JDK的编译器信息
扫码看视频
Eclipse是主流的Java开发工具之一,是由IBM公司开发的集成开发工具。本小节对Eclipse的下载与启动予以讲解。
Eclipse的下载步骤如下。
(1)打开浏览器,进入Eclipse的官网首页,然后单击图1.21所示的Download Packages超链接。
图1.21 Eclipse的官网首页
(2)单击Download Packages超链接后,进入Eclipse Packages页面,先在当前页面下方找到Eclipse IDE for Java Developers,再单击与其对应的Windows操作系统的64-bit超链接,如图1.22所示。
图1.22 单击Windows操作系统的64-bit超链接
说明
(1)为了匹配64位Windows操作系统的Java SE 11,需要下载64位Windows操作系统的Eclipse。
(2)Eclipse的版本更新速度比较快,因此,读者在下载Eclipse时如果没有64位的Eclipse 2019-09版本,可以直接下载最新版本的64位Eclipse进行使用。
(3)单击与Eclipse IDE for Java Developers对应的Windows操作系统的64 bit超链接后,Eclipse服务器会根据客户端所在的地理位置分配合理的下载镜像站点,读者只需单击Download按钮,即可下载64位Windows操作系统的Eclipse。Eclipse的下载镜像站点页面如图1.23所示。
图1.23 Eclipse的下载镜像站点页面
将下载好的Eclipse压缩包解压后,就可以启动Eclipse了。启动Eclipse的步骤如下。
(1)在Eclipse解压后的文件夹中双击eclipse.exe文件。
(2)在弹出的Eclipse IDE Launcher对话框中设置Eclipse的工作空间(用于保存Eclipse建立的程序项目和相关设置),即在Eclipse IDE Launcher对话框的Workspace文本框中输入.\workspace。
说明
“.\workspace”指定的文件地址是Eclipse解压后的文件夹中的workspace文件夹。
(3)输入.\workspace后单击Launch按钮,即可进入Eclipse的工作台,Eclipse IDE Launcher对话框如图1.24所示。
图1.24 Eclipse IDE Launcher对话框
注意
选中Use this as the default and do not ask again复选框可以将该地址设为默认工作空间,从而在启动Eclipse时就不会再询问工作空间的设置了。
首次启动Eclipse时,Eclipse会呈现图1.25所示的欢迎界面。
图1.25 Eclipse的欢迎界面
扫码看视频
关闭Eclipse的欢迎界面,即可进入Eclipse的工作台。Eclipse的工作台是开发人员编写程序的主要场所。本节将介绍Eclipse工作台中的各个窗口和菜单。
Eclipse工作台主要包括标题栏、菜单栏、工具栏、编辑器、透视图和相关的视图等窗口,各个窗口如图1.26所示。
图1.26 Eclipse工作台中的各个窗口
由图1.26可知,Eclipse的菜单栏包含File菜单、Edit菜单、Source菜单、Refactor菜单、Navigate菜单、Search菜单、Project菜单、Run菜单、Window菜单和Help菜单。Eclipse的菜单栏中各个菜单的相关说明如表1.1所示。
表1.1 Eclipse的菜单栏中各个菜单的相关说明
菜单名称 |
菜单说明 |
---|---|
File |
File菜单可以打开文件、关闭编辑器、保存编辑的内容、重命名文件等。此外还可以向工作区导入内容和导出工作区的内容以及退出Eclipse等 |
Edit |
Edit菜单有复制和粘贴等功能 |
Source |
Source菜单包含一些关于编辑Java源码的操作 |
Refactor |
Refactor菜单可以自动检测类的依赖关系并修改类名 |
Navigate |
Navigate菜单包含一些快速定位到资源的操作 |
Search |
Search菜单可以设置在指定工作区内对指定字符的搜索 |
Project |
Project菜单包含一些关于项目的操作 |
Run |
Run菜单包含一些关于代码执行模式与调试模式的操作 |
Window |
Window菜单允许同时打开多个窗口及关闭视图。Eclipse的参数设置也在该菜单下进行 |
Help |
Help菜单包含显示帮助的窗口和Eclipse的描述信息。此外,还可以在该菜单下安装插件 |
扫码看视频
编写一个Java应用程序需要经过图1.27所示的5个步骤。
图1.27 编写Java应用程序的5个步骤
要编写一个Java应用程序,首先需要新建Java项目。在Eclipse中新建Java项目的步骤如下。
(1)单击File→选择New→单击Java Project菜单项,打开New Java Project(新建Java项目)对话框。打开New Java Project对话框的步骤如图1.28所示。
图1.28 打开New Java Project对话框的步骤
(2)New Java Project对话框如图1.29所示。首先在Project name(项目名)文本框中输入MyTest,然后在Project layout(项目布局)选项组中确认Create separate folders for sources and class files(为源文件和类文件新建单独的文件夹)单选按钮被选中,最后单击Finish(完成)按钮,完成项目的新建。
图1.29 New Java Project对话框
(3)单击Finish按钮后,会弹出图1.30所示的New module-info.java(新建模块化声明文件)对话框。模块化开发是JDK9新增的特性,但模块化开发过于复杂,并且新建的模块化声明文件也会影响Java项目的运行,因此需要单击新建模块化声明文件对话框中的Don’t Create按钮。单击Don’t Create按钮后,即可完成Java项目MyTest的创建。
图1.30 新建模块化声明文件的对话框
Java类是存储Java代码的文件,扩展名是.java。在Eclipse中新建Java类的步骤如下。
(1)右击新建的Java项目MyTest,在弹出的快捷菜单中选择New,单击Class菜单项,如图1.31所示。
图1.31 打开New Java Class(新建Java类)对话框的步骤
(2)打开New Java Class(新建Java类)对话框后,首先在Name文本框中输入First(Java类的名称),表示第一个Java应用程序;然后选中复选框public static void main(String[] args);最后单击Finish按钮。新建Java类的步骤如图1.32所示。
图1.32 New Java Class对话框
单击Finish按钮后,Eclipse的工作台如图1.33所示。
图1.33 新建First类后Eclipse的工作台
注意
如果Eclipse显示的代码字体比较小,那么针对64位的Eclipse 2019-09版本,读者朋友可以直接按快捷键<Ctrl + =>调大代码字体。
实例1-1 输出金庸14部小说作品口诀。(实例位置:资源包\MR\源码\01\01。)
新建First类后,就可以在First类中编写“输出金庸14部小说作品口诀”程序的代码,在图1.33所示的第6行输入如下代码。
System.out.println("飞雪连天射白鹿,");
System.out.println("笑书神侠倚碧鸳。");
注意
(1)println中的l不是数字1,而是小写字母l。
(2)上述代码的括号、双引号和分号均为英文格式下的标点符号。
编写完Java代码后,需要对其进行保存。保存Java代码有3种方式。
(1)在Eclipse中按快捷键<Ctrl +S>保存当前的.java文件。
(2)在菜单栏中右击File,在弹出的快捷菜单中选择Save菜单项(保存当前的.java文件)或者Save All菜单项(保存全部的.java文件)。
(3)单击工具栏中的按钮(等价于Save)或者
按钮(等价于Save All)。
在代码编辑区的空白区域右击,在弹出的快捷菜单中选择Run As→单击1 Java Application,即可运行Java应用程序。具体步骤如图1.34所示。
图1.34 运行Java应用程序的具体步骤
上述代码的运行结果如图1.35所示。
图1.35 First类的运行结果
扫码看视频
Java API即Java API文档,记录了Java语言中海量的知识点,是Java应用程序设计人员即查即用的编程词典。Java API对Java应用程序设计人员的重要性类似于《现代汉语词典》对高中生的重要性。
API的全称是Application Programming Interface,即应用程序编程接口,主要包括类的继承结构、成员变量、成员方法、构造方法、静态成员的描述信息和详细说明等内容。读者朋友可以在https://docs.oracle.com/en/java/javase/11/docs/api/index.html中找到JDK11的API文档,如图1.36所示。
图1.36 JDK11的API文档
说明
JDK11的API文档暂无中文版本,读者朋友在查询知识点时,可以借助网上流行的英译汉词典进行学习。
本小节将以java.lang.String为例,介绍JDK11的API文档的使用方法。在JDK11的API文档中查询java.lang.String的操作步骤如图1.37所示。
图1.37 查询java.lang.String的操作步骤
单击java.lang.String后,页面即会显示java.lang.String的相应内容(类的继承结构、成员变量、成员方法、构造方法、静态成员的描述信息和详细说明等),如图1.38所示。
图1.38 java.lang.String的相应内容
(1)安装JDK后,下列哪一项不是bin目录下的主要开发工具?( )
A. javac B. JVM C. javadoc D. java
(2)下列哪一项是Java语言的编辑器?( )
A. javac.exe B. JDK C. JRE D. java.exe
(3)下列哪一项是编译Java程序的命令?( )
A. jar B. javac C. javadoc D. java
(4)下列哪一项是运行Java程序的命令?( )
A. jar B. javac C. javadoc D. java
(5)下列哪一项是正确的main()方法?( )
A. static void main(String[] args) B. public void main(String[] args)
C. public static void main(String args[]) D. public void static main(String[] args)
视频教学:62分钟
在真正学习Java这门编程语言之前,应该对Java代码的组成部分有一个基本的了解。本章首先介绍Java代码的组成部分及语法结构,然后引入Java语言中变量和常量的相关知识,最后讲解如何在控制台中进行输入与输出。
扫码看视频(上)
扫码看视频(中)
扫码看视频(下)
Java代码由类、主方法、关键字、标识符和注释等内容组成。本节将一一对其进行介绍。
类是Java程序的基本单位,是包含某些共同特征的实体的集合。例如,在某影视网站上,按照电影 → 科幻 → 中国大陆 → 2019的搜索方式能够搜索到《流浪地球》《疯狂的外星人》《上海堡垒》《最后的日出》等影视作品。
换言之,《流浪地球》《疯狂的外星人》《上海堡垒》《最后的日出》等影视作品可以被归纳为2019年上映的中国大陆的科幻电影类。
使用Java语言创建类时,需要使用class关键字,创建类的语法如下。
[修饰符] class 类名称{ }
在程序设计过程中,开发人员为了避免程序的重要部分被其他程序员访问,需要借助修饰符予以实现。例如,class被public修饰时,此时的public被称作公共类修饰符。如果一个类被public修饰,那么这个类被称作公共类,能够被其他类访问。此外,Java语言还提供了其他修饰符,例如private、protected等。修饰符的相关内容详见后续章节。
注意
(1)class与类名称之间必须至少有一个空格,否则Eclipse会出现图2.1所示的错误提示。
图2.1 class与类名称之间没有空格
(2)“{”和“}”之间的内容叫作类体。类体包含主方法、注释和Java语句等内容,如图2.2所示。
图2.2 类体
主方法,即main()方法,是Java程序的入口,用于指定程序从这里开始被执行。主方法的语法如下。
public static void main(String[] args){
//方法体
}
主方法的各个组成部分的说明如下。
public:当使用public修饰方法时,public被称作公共访问控制符,能够被其他类访问。
static:被译为“全局”或者“静态”。主方法被static修饰后,当Java程序运行时,会被JVM(Java虚拟机)第一时间找到。
void:指定主方法没有具体的返回值(即什么也不返回);关于返回值,如果把投篮看作一个方法,那么投篮方法将具有两个返回值,即篮球被投进篮筐和篮球没有被投进篮筐。
main:能够被JVM识别的、不可更改的一个特殊的单词。
String[] args:主方法的参数类型,参数类型是一个字符串数组,该数组的元素是字符串。有关数组和字符串的相关知识,读者可参阅本书的第6章和第9章。
在Java语言中,关键字是指被赋予特定意义的一些单词,是Java程序重要的组成部分。凡是在Eclipse中显示为红色粗体的单词,都是关键字。在编写代码时,既要正确区分关键字的大小写,又要避免关键字拼写错误,否则,Eclipse将出现图2.3和图2.4所示的错误提示。
注意
读者朋友在使用Java语言中的关键字时,要注意以下两点。
(1)表示关键字的英文单词都是小写的。
(2)不要少写或者错写英文字母,如将import写成imprt、super写成supre。
图2.3 大小写错误
图2.4 关键字的拼写错误
Java中的关键字及其说明如表2.1所示,其中带有★标志的是Java程序中出现频率较高的关键字。
表2.1 Java中的关键字及其说明
关键字 |
说明 |
---|---|
abstract |
表明类或者成员方法具有抽象属性 |
assert |
断言,用来进行程序调试 |
boolean★ |
布尔类型 |
break★ |
跳出语句,提前跳出一个代码块 |
byte★ |
字节类型 |
case |
用在switch语句之中,表示其中的一个分支 |
catch |
用在异常处理中,用来捕捉异常 |
char★ |
字符类型 |
class★ |
用于声明类 |
const |
保留关键字,没有具体含义 |
continue★ |
回到一个代码块的开始处 |
default |
默认,例如在switch语句中表示默认分支 |
do |
do-while循环结构使用的关键字 |
double★ |
双精度浮点类型 |
else★ |
用在条件语句中,表示当条件不成立时的分支 |
enum |
用于声明枚举 |
extends |
用于创建继承关系 |
final★ |
用于声明不可改变的最终属性,例如常量 |
finally |
声明异常处理语句中始终会被执行的代码块 |
float★ |
单精度浮点类型 |
for★ |
for循环语句关键字 |
goto |
保留关键字,没有具体含义 |
if★ |
条件判断语句关键字 |
implements |
用于创建类与接口的实现关系 |
import★ |
导入语句 |
instanceof |
判断两个类的继承关系 |
int★ |
整数类型 |
interface |
用于声明接口 |
long★ |
长整数类型 |
native |
用来声明一个方法是由与计算机相关的语言(如C、C++、Fortran语言)实现的 |
new★ |
用来创建新实例对象 |
package★ |
包语句 |
private |
私有权限修饰符 |
protected |
受保护权限修饰符 |
public★ |
公有权限修饰符 |
return★ |
返回方法结果 |
short★ |
短整数类型 |
static★ |
静态修饰符 |
strictfp |
用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754-2008算术规范 |
super |
父类对象 |
switch★ |
分支结构语句关键字 |
synchronized |
线程同步关键字 |
this |
本类对象 |
throw |
抛出异常 |
throws |
将异常处理抛向外部方法 |
transient |
声明不用序列化的成员域 |
try★ |
尝试监控可能抛出异常的代码块 |
var |
声明局部变量 |
void★ |
表明方法无返回值 |
volatile |
表明两个或者多个变量必须同步地发生变化 |
while★ |
while循环语句关键字 |
说明
(1)Java语言中的关键字不是一成不变的,而是随着新版本的发布而不断变化的。
(2)Java语言中的关键字不需要专门记忆,随着编写代码的熟练度的提高,自然就记住了。
什么是标识符呢?先来看一个生活实例,小王乘坐地铁时,偶遇到了某位同事并随即喊出了这位同事的名字,这个名字就是这位同事的“标识符”。而在Java语言中,标识符是指开发者在编写程序时为类、方法等内容定义的名称。为了提高程序的可读性,在定义标识符时,要尽量遵循“见名知意”的原则。例如,当其他开发人员看到类名ScienceFictionFilms时,就会知道这个类表示的是科幻电影。
Java标识符的具体命名规则如下。
(1)标识符由一个或多个字母、数字、下划线“_”和美元符号“$”组成,字符之间不能有空格。
【正例】a、B、name、c18、$table、_column3。
【反例】hi!、left<、name。
错误展示图如图2.5所示。
图2.5 字符之间不能有空格
(2)一个标识符可以由几个单词连接而成,以提高标识符的可读性。
对于类名称,每个单词的首字母均为大写。
【正例】表示“科幻电影类”的类名称是ScienceFictionFilms。
变量或者方法名称应采用驼峰式命名规则,即首个单词的首字母为小写,其余单词的首字母为大写。
【正例】表示“用户名”的变量名是userName。
对于常量,每个单词的所有字母均为大写;单词之间不能有空格,但可以用英文格式的下划线“_”进行连接。
【正例】表示“一天的小时数”的常量名是HOURSCOUNTS,也可写作HOURS_COUNTS。
【反例】表示“一天的分钟数”的常量名是MINUTES COUNTS,错误展示图如图2.6所示。
图2.6 单词之间不能有空格
(3)标识符中的第一个字符不能为数字。
【反例】使用24hMinutes命名表示“24个小时的分钟数”的变量,错误展示图如图2.7所示。
图2.7 标识符中的第一个字符不能为数字
(4)标识符不能是关键字。
【反例】使用class命名表示“班级”的变量,错误展示图如图2.8所示。
图2.8 标识符不能是关键字
说明
(1)Java语言严格区分单词的大小写,同一个单词的不同形式所代表的含义是不同的。例如,Class和class代表着两种完全不同的含义:Class是一个类名称,而class是被用来修饰类的关键字。
(2)Java可以用中文作为标识符,但中文标识符不符合开发规范。当Java代码的编译环境发生改变后,中文会变成乱码,这将导致Java代码无法通过编译。
当我们遇到一个陌生的英文单词时,会借助英汉词典进行解惑,词典会给出这个单词的中文解释。Java语言也具有如此贴心的功能,即“注释”。注释是一种对代码程序进行解释、说明的标注性文字,可以提高代码的可读性。在开篇代码中,“//”后面的内容就是注释。注释会被Java编译器忽略,不会参与程序的执行过程。
Java提供了3种代码注释,分别为单行注释、多行注释和文档注释。
“//”为单行注释标记,从符号“//”开始直到换行为止的所有内容均作为注释而被编译器忽略。单行注释的语法如下。
//注释内容
例如,声明一个int类型的表示年龄的变量age,并为变量age添加注释。
int age; // 声明一个int类型的表示年龄的变量age
说明
int是Java语言中的一种整数类型(第3章将详细介绍)。因为年龄是整数,所以需要用整数类型予以声明。
注意
注释可以出现在代码的任意位置,但是不能分隔关键字或者标识符,错误展示图如图2.9所示。
图2.9 注释不能分隔关键字
“/*…*/”为多行注释标记,符号“/*”与“*/”之间的所有内容均为注释内容且可以换行。多行注释标记的作用有两个:为Java代码添加必要信息和将一段代码注释为无效代码。多行注释的语法如下。
/*
注释内容1
注释内容2
...
*/
例如,使用多行注释添加版权和作者信息的效果图如图2.10所示,使用多行注释将一段代码注释为无效代码的效果图如图2.11所示。
图2.10 使用多行注释添加版权和作者信息
图2.11 使用多行注释将一段代码注释为无效代码
Java语言还提供了一种借助Javadoc工具能够自动生成说明文档的注释,即文档注释。
说明
Javadoc工具是由Sun公司提供的。待程序编写完成后,借助Javadoc工具就可以生成当前程序的说明文档。
“/**…*/”为文档注释标记,符号“/**”与“*/”之间的内容为文档注释内容。不难看出,文档注释与一般注释的最大区别在于它的起始符号是“/**”而不是“/*”或“//”。
例如,使用文档注释为main()方法添加注释的效果如图2.12所示。
图2.12 为main()方法添加文档注释
说明
一定要养成良好的编码习惯。软件编码规范中提到“可读性第一,效率第二”,所以程序员必须要在程序中添加适量的注释来提高程序的可读性和可维护性。建议程序中的注释总量占程序代码总量的20%~50%。
表2.2所示为文档注释的标签语法。
表2.2 文档注释的标签语法
文档注释的标签 |
解释 |
---|---|
@version |
指定版本信息 |
@since |
指定最早出现在哪个版本 |
@author |
指定作者 |
@see |
生成参考其他的说明文档的链接 |
@link |
生成参考其他的说明文档,它和@see标签的区别在于@link标记能够嵌入注释语句中,为注释语句中的特殊词汇生成链接 |
@deprecated |
用来注明被注释的类、变量或方法已经不提倡使用,在将来的版本中有可能被废弃 |
@param |
描述方法的参数 |
@return |
描述方法的返回值 |
@throws |
描述方法抛出的异常,指明抛出异常的条件 |
说明
(1)注释的位置的具体要求如下。
单行注释应该写在被注释的代码的上方或右侧。
多行注释的位置和单行注释相同,虽然多行注释可以写在代码之内,但不建议这样写,因为这样写会降低代码可读性。
文档注释必须写在被注释代码的上方。
(2)注释是代码的说明书,用于说明代码是做什么的、使用代码时需要注意的问题等内容。编写注释时,既不要写代码中直观体现的内容,也不要写毫无说明意义的内容。
上一节讲解了Java代码的组成部分,本节将介绍Java语言中的两个重量级的概念:变量和常量。例如,某天美元兑换人民币的汇率为6.7295,某天92号汽油的价格为每升6.95元等,这些可以被改变数值的量称作变量;而1分钟等于60秒,一年有12个月等,这些不可以被更改数值的量称作常量。下面将对变量和常量的异同进行讲解。
扫码看视频
在讲解变量前,先来解释下声明的含义。声明指的是变量被创建后,没有被赋予具体数值的过程。那么,变量应该如何声明呢?
变量是用来存储数值的,但计算机并不聪明,无法自动分配指定大小的内存空间来存储这些数值。这时,需要借助Java语言提供的数据类型(第3章将详细介绍)予以实现。
声明变量的语法如下。
数据类型 变量标识符;
例如,某电商平台售有后壳为玻璃的手机壳,售价为49.9元,如图2.13所示。现声明表示手机壳售价的变量shellPrice。
图2.13 后壳为玻璃的手机壳
因为表示手机壳售价的变量shellPrice的值是一个小数,而在Java语言中,默认用表示浮点类型的double声明值为小数的变量,所以变量shellPrice的数据类型应为double。因此,声明变量shellPrice的代码如下。
double shellPrice;
声明变量后,要为变量赋值,为变量赋值的过程称作定义、初始化或者赋初值。为变量赋值的语法如下。
数据类型 变量标识符 = 变量值;
例如,为上文中表示手机壳售价的变量shellPrice赋值,值为49.9,代码如下。
double shellPrice = 49.9;
注意
选择正确的数据类型是至关重要的,否则Eclipse会出现图2.14所示的错误提示。
图2.14 数据类型选择不当
说明
int是Java语言中的一种整数类型,其存储的是整数数值。而49.9是一个小数,这使得等号左右两端的数据类型不匹配,因此需要使用Java语言中表示浮点类型的double予以存储。
声明变量时,对于相同数据类型的变量,可以同时声明多个。同时声明多个变量的语法如下。
数据类型 变量标识符1, 变量标识符2, …, 变量标识符n;
例如,某超市特价销售3种水果,即苹果每500克4.98元、橘子每500克3.98元和香蕉每500克2.98元;现同时声明表示苹果价格的变量applePrice、表示橘子价格的变量orangePrice和表示香蕉价格的变量bananaPrice。因为苹果价格、橘子价格和香蕉价格都是小数,所以这3个变量的数据类型均为double,代码如下。
double applePrice, orangePrice, bananaPrice;
声明变量applePrice、orangePrice和bananaPrice后,要分别为这3个变量赋值,进而表示这3种特价水果的价格。赋值的方式有以下两种。
(1)声明时直接赋值,代码如下。
double applePrice = 4.98, orangePrice = 3.98, bananaPrice = 2.98;
(2)先声明,再赋值,代码如下。
double applePrice, orangePrice, bananaPrice;
applePrice = 4.98;
orangePrice = 3.98;
bananaPrice = 2.98;
注意
多个变量在“先声明,再赋值”的过程中,多个赋值语句不能使用逗号间隔开且写在同一行;否则,Eclipse会出现图2.15所示的错误提示。
图2.15 多个赋值语句不能使用逗号间隔开且写在同一行
扫码看视频
如果一个值是确定且不会被改变的,那么用常量来存储这个值。例如,1分钟等于60秒,60就可以被设置为常量;而2月有多少天是不固定的,非闰年时有28天,闰年时有29天,这种会根据条件变化的值不可以被设置为常量。
如果要声明一个常量,那么需借助关键字final。关键字final被译为“最终的”,当修饰常量时,就相当于标记这个常量的值不允许被改变。声明常量的语法如下。
final 数据类型 常量标识符;
例如,声明一个表示1分钟等于多少秒的常量SECONDS,代码如下。
final int SECONDS;
声明常量时,通常要直接为其赋值,为常量赋值的语法如下。
final数据类型 常量标识符 = 常量值;
例如,为上文中表示1分钟等于多少秒的常量SECONDS赋值,值为60,代码如下。
final int SECONDS = 60;
如果需要同时声明多个同一数据类型的常量,可以采用如下格式。
final 数据类型 常量标识符1 = 常量值1, 常量标识符2 = 常量值2, …, 常量标识符n = 常量值n;
例如,声明多个常量,表示“1天有24小时,有1440分钟,有86400秒”,代码如下。
final int HOURS = 24, MINUTES = 1440, SECONDS = 86400;
在声明常量时,如果已经对其赋值了,那么常量的值不允许再被修改;否则,Eclipse会出现图2.16所示的错误提示。
图2.16 常量的值不允许再被修改
生活中的输入与输出设备有很多。摄像机、扫描仪、话筒、键盘等都是输入设备,经过计算机解码后,由输入设备导入的图片、视频、音频和文字会在显示器、打印机、音响等输出设备进行输出,如图2.17所示。本节要讲解的控制台的输入和输出指的是先使用键盘输入字符,再将输入的字符显示在显示器上。
图2.17 常用输入与输出设备
本书使用的是Eclipse编程软件,而Eclipse的输出方式指的是在控制台中输出。所谓控制台,指的是图2.18所示的Console窗口。通过Console窗口,可以输出Java代码的运行结果。
图2.18 Eclipse中的Console窗口
扫码看视频
在控制台中输出字符的方法有3种,具体如下。
print()方法的语法如下。
System.out.print("By falling we learn to go safely!");
控制台输出“By falling we learn to go safely!”后,光标会停留在这句话的末尾处,不会自动跳转到下一行的起始位置。
println()方法在print后面加上了“ln”(即line的简写)后缀,语法如下。
System.out.println("迷茫不可怕,只要你还在向前走!");
控制台输出“迷茫不可怕,只要你还在向前走!”后,光标会自动跳转到下一行的起始位置。
print()方法与println()方法输出的效果对比如表2.3所示。
表2.3 两种输出方法的效果对比
Java代码 |
运行结果 |
---|---|
System.out.print("梦想"); System.out.print("insist"); System.out.print("( ̄_ ̄)"); |
梦想insist( ̄_ ̄) |
System.out.println("比萨"); System.out.println("future"); System.out.println("(*^▽^*)"); |
比萨 future (*^▽^*) |
所以Java换行输出的方法有以下两种。
System.out.print("\n"); //利用换行符“\n”实现换行
System.out.println(); //空参数即可实现换行
注意
使用这两个方法的时候还要注意以下两点。
(1)语句“System.out.println("\n");”会输出两行空行。
(2)语句“System.out.print();”无参数会报错。
实例2-1 创建“老者与小孩的故事”的OlderAndChildStory类。(实例位置:资源包\MR\源码\02\01。)
利用Java输出语句模拟老者与小孩的对话,对话内容如图2.19所示。
图2.19 老者与小孩的对话内容
创建含义为“老者与小孩的故事”的OlderAndChildStory类,在类中创建main()方法,在main()方法中使用System.out.println()模拟老者与小孩的对话,具体代码如下。
public class OlderAndChildStory {
public static void main(String[] args) {
int age = 3; ⇽--- 创建整数类型变量age,记录小孩的年龄
System.out.println("老者:小朋友今年几岁啊?"); ⇽--- 老者在控制台中问了一个问题
System.out.println("小孩:" + age + “岁!"); ⇽--- 小孩在控制台中回答了自己的年龄
System.out.println("老者:那明年又是几岁啊?"); ⇽--- 老者又在控制台中问了一个问题
int nextYearAge = age + 1; ⇽--- 小孩对自己的年龄做了一次加法运算
System.out.println("小孩:" + nextYearAge + "岁!"); ⇽--- 小孩在控制台中回答了计算得到的年龄
}
}
运行结果如图2.20所示。
图2.20 输出不同类型的值
除了前面两种常规的输出方式,Java语言还提供了格式化输出。例如,超市购物小票上的应收金额保留了两位小数,如图2.21所示。
图2.21 应收金额保留两位小数
Java沿用了C++中用于格式化输出的printf()函数,使用该函数即可将指定的内容以指定的格式输出在控制台中,其语法如下。
printf(String format, Object…args)
其中,参数format被译为“格式化的”,这里表示需要使用格式化的公式;参数args被译为“计算机参数”,是一个Object类型的可变参数,可变表示参数args的个数可以是多个。
下面着重介绍两种用于格式化输出的转换符。
输出数字时使用转换符“%d”,举例如下。
System.out.printf("1251+3950的结果是:%d\n", 1251 + 3950);
输出结果如下。
1251+3950的结果是:5201
指定小数位数时可以使用转换符“%f”,%与f之间用“.X”的形式指定小数位数。其中,X表示的是小数位数。例如,圆周率π的近似值为3.1415926,这里保留小数点后两位小数,代码如下。
System.out.printf("π取两位小数:%.2f\n", 3.1415926);
输出结果如下。
π取两位小数:3.14
扫码看视频
有输出就会有输入,Java从控制台中读取用户输入的值时需要借助一个被称作Scanner的类。Scanner译为“扫描仪”,其用途和现实生活中的扫描仪一样,能够扫描用户输入的内容。Java语言中的System.in()方法表示从控制台输入,使用Scanner类扫描System.in()方法即可获取用户输入的值。
需要注意的是,Scanner类在java.util这个包里,不能像System类那样直接被使用。因此,使用前需要先使用import语句导入java.util包中的Scanner类。下面先对import语句进行介绍。
import语句用来导入本类所在包之外的类,导入具体包或完整类之后,就可以调用导入的类,举例如下。
import java.util.Date;
import java.util.Scanner;
import语句与导入的类所在位置如图2.22所示。
图2.22 import语句与引入的类位置
import语句可以一次将某个包中的所有类都导入,“*”作为所有类名的替代符号,语法如下。
import java.util.*;
但有一点要注意,“*”只能替代类名,不能替代包名。例如,导入java.awt包中的所有类和java.awt的event子包中的所有类,需要写两条import语句,代码如下。
import java.awt.*;
import java.awt.event.*;
上面介绍了import语句,使用import语句导入Scanner类的代码如下。
import java.util.Scanner; // 导入java.util包中的Scanner类
Scanner类提供了表2.4所示的常用方法,通过这些方法可以获取控制台中输入的不同类型的值。
表2.4 Scanner类的几个常用方法
方法名 |
返回类型 |
功能说明 |
---|---|---|
next()★ |
String |
查找并返回此扫描器获取的下一个完整标记 |
nextBoolean() |
boolean |
扫描一个布尔值标记并返回 |
nextBtye() |
byte |
扫描一个值并返回byte类型 |
nextDouble() |
double |
扫描一个值并返回double类型 |
nextFloat() |
float |
扫描一个值并返回float类型 |
nextInt() |
int |
扫描一个值并返回int类型 |
nextLine()★ |
String |
扫描一个值并返回String类型 |
nextLong() |
long |
扫描一个值并返回long类型 |
nextShort() |
short |
扫描一个值并返回short类型 |
close() |
void |
关闭此扫描器 |
说明
nextLine()方法扫描的内容是从第一个字符开始到换行符为止,而next()、nextInt()等方法扫描的内容是从第一个字符开始到这段完整内容结束。
使用Scanner类扫描控制台的代码如下。
Scanner sc=new Scanner(System.in);
其中,System.in表示控制台的输入。在创建Scanner扫描器类的对象时,需要把System.in作为参数。
实例2-2 创建含义为“年龄示例”的AgeDemo类。(实例位置:资源包\MR\源码\02\02。)
创建含义为“年龄示例”的AgeDemo类,实现根据输入的年份(4位数字,如1981),计算目前的年龄,程序中使用Scanner扫描器类的nextInt()方法获取用户输入的数字,使用Calendar日历类获取当前年份数字,通过当前年份数字减去输入的年份数字得到年龄,具体代码如下。
import java.util.Calendar; ⇽---
import java.util.Scanner; ⇽--- 首先使用import语句导入Scanner和Calendar类,让程序知道会用到这两个类
public class AgeDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); ⇽--- 告诉Scanner类要扫描控制台
Calendar c = Calendar.getInstance(); ⇽--- 获取系统日历
int thisYear = c.get(Calendar.YEAR); ⇽--- 从日历中取出当前年份数字,并记录下来
System.out.println("请输入您的出生年份"); ⇽--- 给用户显示一个提示
int birth = sc.nextInt(); ⇽--- 从控制台中扫描出用户输入的年份数字
int age = thisYear - birth;
System.out.println("您的年龄为:" + age);
if (age < 18) { ⇽---
System.out.println("您现在是未成年人(
´
`
)");
} else if (age >= 18) {
System.out.println("您现在是青年人(^_-)☆");
} else if (age >= 66) {
System.out.println("您现在是中年人(
)");
} else if (age >= 88) {
System.out.println("您现在是老年人~@_@~”);
} ⇽--- 判断用户属于哪个年龄段
}
}
运行程序,提示输入出生年份。输入的出生年份必须是4位数字,例如2005。输入之后按<Enter>键,运行结果如图2.23所示。
图2.23 根据输入的出生年份计算年龄
说明
图2.24所示的“2005”是用户输入的,在运行程序时,读者可以自行输入。
(1)输出菱形。创建Image类,在Eclipse的控制台中输出图2.24所示的菱形。(答案位置:资源包\章后练习\02\01)
图2.24 输出菱形
(2)输出错误信息与调试信息。程序设计中,业务代码的部分功能需要配合调试信息以确定代码执行流程和数据的正确性,当程序出现严重问题时还要输出警告信息,这样才可以在调试中完成程序设计,运行效果如图2.25所示。(答案位置:资源包\章后练习\02\02)
图2.25 输出错误信息与调试信息
(3)从控制台接收输入的文本。System类除了有out和err两个输出流之外,还有in输入流的实例对象作为类成员,它可以接收用户的输入。本题要求通过该输入流实现从控制台接收用户输入文本,并提示该文本的长度信息,运行效果如图2.26所示。(答案位置:资源包\章后练习\02\03)
图2.26 从控制台接收输入的文本并输出文本长度信息
(4)输入Wi-Fi密码。创建PassWord类,首先在控制台中输入用户名为MRKJ的Wi-Fi密码,然后对这个Wi-Fi密码进行验证。如果Wi-Fi密码正确,那么控制台输出“正在获取ip地址……已连接”;否则,控制台输出“密码错误”,运行效果如图2.27所示。(答案位置:资源包\课后练习\02\04)
图2.27 输入Wi-Fi密码