第1章 初 识 Java 主要内容 . 开发环境 . 简单的Java程序 在学习Java语言之前,读者应当学习过 C语言,并熟悉计算机的一些基础知识。读者学习过Java语言 之后,可以继续学习和Java相关的一些重要内容。比如,如果希望编写和数据库相关的软件,可以深入学习 JavaDatabaseConnectivity(JDBC);如果希望从事 Web程序的开发,可以学习JavaServerPages(JSP);如 果希望从事手机应用程序设计,可以学习 Android;如果希望从事和网络信息交换有关的软件设计,可以学 习 XML(eXtensibleMarkupLanguage);如果 希 望 从 事 大 型 网 络 应 用 程 序 开 发 与 设 计,可 以 学 习JavaEE (JavaPlatformEnterpriseEdition),如图1-1所示。 图1-1 Java的先导知识与后继技术 本章通过基础训练(见第1.2节)掌握Java程序开发的基本步骤,掌握这些基本步骤对后续章节的学习 是非常重要的。 1.1 开发环境 1.1.1 基础知识 学习任何一门编程语言都需要选择一种针对该语言的开发工具。学习Java最好选用JavaSE(Java标 准版)提供的Java软件开发工具箱:JDK(JavaDevelopmentKit)。JavaSE平台是学习掌握Java语言的最 佳平台,而掌握JavaSE又是进一步学习JavaEE和JSP所必需的。 可以登录 Oracle官方网址免费下载JavaSE提供的JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html 本书使用 Windows操作系统(64位机器),因此下载的版本为JDK11(jdk-11.0.2_windows-x64_bin. zip)。如果读者使用其他的操作系统,可以下载相应的JDK。 在出现的下载页面上找到JavaSE11(LTS,长时间支持的版本)后,单击相应的JDKDownload,然后 在出现的下载选择列表中选择jdk-11.0.2_windows-x64_bin.zip即可。目前,Oracle要求新用户进行注册后 才可以下载JDK。读者可以到作者的网盘下载JDK,地址如下: https://pan.baidu.com/s/1B995h-3DLbqSiCKtRnuHrw 3 图1-4 编辑系统环境变量 path的值 MS-DOS命令行进行临时设置,示例如下: path C:\jdk-11.0.2bin;%path% 其中%path%是path已有的全部的值,而 C:\jdk-11.0.2bin是需要的新值。如果临时设置不包含 path 已有的值,那么当前 MS-DOS命令行窗口只能使用新值,而path曾有的值就无法使用了。 1990年 Sun公司成立了由JamesGosling(后来被称为“Java语言之父”)领导的开发小组,开始致力于 开发一种可移植的、跨平台的语言,该语言能生成正确运行于各种操作系统及各种 CPU 芯片上的代码。他 们的精心研究和努力促成了Java语言的诞生。1995年5月Sun公司推出的JavaDevelopmentKit1.0a2版 本,标志着Java语言的诞生。美国的著名杂志PC Magazine 将Java语言评为1995年十大优秀科技产品之 一。Java的快速发展得益于Internet和 Web的出现,Internet上的各种不同计算机可能使用完全不同的操 作系统和 CPU 芯片,但仍希望运行相同的程序,Java的出现标志着分布式系统的真正诞生。 1.1.3 上机实践 1.使用命令行 使用JDK环境开发Java程序,需打开 MS-DOS命令行(Win10系统中叫命令提示符),可以单击计算机 左下角的“开始”按钮,在“Windows系统”下找到“命令提示符”选项,单击该选项打开 MS-DOS命令行或右 击计算机左下角的“开始”按钮,找到“运行”选项,单击该选项,在弹出的对话框中输入“cmd”打开 MS-DOS 命令行。对于 Win7操 作 系 统,可 以 通 过 单 击 “开 始”按 钮,选 择 “程 序”→“附 件”→“MS-DOS”,打 开 MSDOS 命令行。 更换逻辑分区(盘符)。如果目前 MS-DOS命令行显示的不是逻辑分区的根目录,键入“cd\”回车确认。 从一个逻辑分区转到另一个逻辑分区,只需在 MS-DOS键入要转入的逻辑分区的分区名,按回车确认即可。 例如,如果目前逻辑盘符是“C:\>”,请键入“D:”回车确认,就可使得当前 MS-DOS命令行的状态是“D:\ >”。如果目前显示的逻辑盘符是“D:\>”,请输入“C:”回车确认,就可使得当前 MS-DOS命令行的状态是 “C:\>”。 更换目录。进入某个子目录(文件夹)的命令是“cd 目录名”;退出某个子目录的命令是“cd..”。例如, 从目录example退到目录 boy的命令是“c:\boy>example>cd..”。退到根目录的命令是“cd\”。 4 2.检查编译器 在当前 MS-DOS命令行中输入“javac”并按回车确认,看 是 否 出 现 如 图 1-5所 示 的 界 面。如 果 出 现 如 图1-5所示的界面,表明系统成功找到了JDK提供的编译器:javac。如果未能出现如图1-5所示的界面,而 出现如图1-6所示的界 面,说 明 path的 设 置 有 错 误,系 统 不 能 找 到 JDK 提 供 的 编 译 器,这 时 需 重 新 设 置 path,并重新打开 MS-DOS命令行,或在当前 MS-DOS命令行中输入path的值: path C:\jdk-11.0.2bin;%path% 按回车键确认,然后输入“javac”并按回车确认,查看是否出现如图1-5所示的界面。 图1-5 path设置正确 图1-6 path设置错误 1.2 简单的 Java 程序 1.2.1 基础知识 无论Java程序的规模大小,要开发一个Java程序都需经过如下基本步骤。 (1)源文件 所谓源文件就是按Java语言的语法规则,使用文本编辑器编写的扩展名为.java的文本文件,如 First. java、Hello.java等,也就是说,Java程序的源文件存放在扩展名为.java的文本文件中。 (2)编译 Java提供的编译器(javac.exe)把Java源文件编译成称为字节码的一种“中间代码”,其扩展名是.class。 (3)运行 编译器得到的字节码文件由Java提供的解释器(java.exe)负责执行。 Java程序的开发步骤如图1-7所示。 图1-7 Java程序的开发过程 1.2.2 基础训练 基础训练的能力目标是掌握开发Java程序基本步骤。基础训练的主要内容如下: 图1-8 程序运行效果 (1)只有一个类的Java应用程序; (2)有多个类的Java应用程序。 1.只有一个类的Java应用程序 编写一个简单程序,该程序输出两行文字:“很高兴学习Java语言”和“Weare students”。程序的运行效果如图1-8所示。 5 (1)源文件 Hello.java 使用一个文本编辑器,如记事本(可以在 Windows附件中找到记事本 notepad)来编写源文件。不可使 用非文本编辑器,如 Word编辑器。将编写好的源文件保存起来,源文件的扩展名必须是.java。Hello.java 源文件的内容如下: public class Hello { public static void main (String args[]) { System.out.println("很高兴学习 Java 语言"); System.out.println("We are students "); } } 将编辑的源文件 Hello.java保 存 到 某 个 磁 盘 的 目 录 中,比 如 保 存 到 C:\ch1目 录 中,并 命 名 为 Hello. java。注意不可写成 hello.java,因为Java语言是区分大小写的。 在保存文件时,将“保存类型”选择为“所有文件”,将“编码”选择为“ANSI”,如图1-9所示。如果在保 存文件时,系统总是自动在文件名尾加上“.txt”(这是不允许的),那么在保存文件时可以将文件名用双引号 括起来。 图1-9 源文件的保存设置 (2)编译 打开 MS-DOS命令行,进入逻辑分区 C:的ch1目录中,使用编译命令javac编译源文件: C:\ch1>javac Hello.java 如果编译无错误,MS-DOS命令行不显示任何出错信息(表明编译成功),如图1-10所示(ch1目录中将 产生名字是 Hello.class的字节码文件)。如果出现错误提示,如图1-11所示(提示第3行有错误,语句缺少 了分号),必须修改源文件中的错误,并保存修改后的源文件,然后再重新编译。 图1-10 编译无错误 图1-11 编译有错误 (3)运行 在 MS-DOS命令行进入逻辑分区 C:的ch1目录中,使用解释器java运行 Hello: C:\ch1>java Hello 运行结果如前面的图1-8所示。注意,运行 Hello.class时,不可以带扩展名.class。 (4)应用程序的主类 一个Java应用程序必须有一个主类,主类的特点是含有 publicstaticvoidmain(Stringargs[])方法, args[]是 main方法的一个参数(以后会学习怎样使用这个参数,args参数是 String类型的数组,注意 String 的首写字母是大写字母 S)。Hello.java源文件中只有主类,没有其他的类。解释器从主类开始运行Java应 用程序。 6 (5)注意事项 Java源程序中语句所涉及的小括号及标点符号都是英文状态下输入的括号和标点符号,比如“很高兴 学习Java语言”中的引号必须是英文状态下的引号,而字符串里面的符号不受汉文字符或英文字符的限制。 在编写程序时,应遵守良好的编码习惯,比如一行最好只写一条语句,保持良好的缩进习惯等。使用大 括号的习惯有两种,一种是向左的大括号“{”和向右的大括号“}”都独占一行;另一种习惯是向左的大括号 “{”在上一行的尾部,向右的大括号“}”独占一行。 如果编译器提示找不到文件“FilenotFond”,那么请检查源文件是否保存在当前目录中,如 C:\ch1,检查是 否将源文件错误地命名为“hello.java”(因为主类的名字是 Hello,Java语言是区分大小写的)或“Hello.txt”。 2.有多个类的Java应用程序 图1-12 计算矩形面积 编写一个简单程序,该程序有两个类:Rect类 和 Example1_2。Rect类 负 责计算矩形的面积,主类 Example1_2负责使用 Rect类输出矩形的面积。程序 的运行结果如图1-12所示。 (1)源文件 Rect.java Rect.java源文件的内容如下: public class Rect { //Rect 类 double width; //长方形的宽 double height; //长方形的高 double getArea(){ //返回长方形的面积 return width*height; } }c lass Example1_2 { //主类 public static void main(String args[]) { Rect rectangle; rectangle=new Rect(); rectangle.width=1.819; rectangle.height=1.5; double area=rectangle.getArea(); System.out.println("矩形的面积:"+area); } } 将编辑的源文件保存到某个磁盘的目录中,比如保存到 C:\ch1文件夹中,并命名为 Rect.java。注意, 不可命名为 Example1_2.java。 (2)源文件的命名 如果源文件中有多个类,那么最多只能有一个类是public类;如果有一个类是 public类,那么源文件的 名字必须与这个类的名字完全相同,扩展名是.java;如果源文件没有 public类,那么源文件的名字只要和某 个类的名字相 同,并 且 扩 展 名 是.java就 可 以 了 (不 要 求 主 类 一 定 是 public类)。源 文 件 中 的 Rect类 是 publlic类,所以必须把源文件命名为 Rect.java,不可以命名为 Example1_2.java。 (3)编译 在 MS-DOS命令行进入逻辑分区 C:的ch1目录中,使用编译器编译源文件: C:\ch1>javac Rect.java 如果编译无错误,ch1目录中将产生名字是 Rect.class和 Example1_2.class的两个字节码文件。 (4)运行 在 MS-DOS命令行进入逻辑分区 C:的ch1目录中,使用解释器运行主类(运行结果如图1-12所示): 7 C:\ch1>java Exmple1_2 注:必须运行主类的字节码。Java程序从主类开始运行。当Java应用程序中有多个类时,Java命令执 行的类名必须是主类的名字(没有扩展名)。当使用解释器java.exe运行应用程序时,Java的运行环境 将 Rect.class和 Example1_2.class加载到内存,然后执行主类的 main方法来运行程序。 3.训练小结与拓展 (1)应用程序的基本结构 Java语言是面向对象编程,一个Java应用程序是由若干个类构成的,即由若干个字节码文件构成,但必 须有一个主类(含有publicstaticvoidmain(Stringargs[])方法的类)。Java应用程序所用的类可以在一个 源文件中,也可以分布在若干个源文件中,有关细节将在第4章学习。在前面的 Rect.java中,Java应用程序 所使用的两个类在一个 Rect.java源文件中。 (2)字节码的平台无关性 平台的核心是操作系统(OS)和处理器(CPU)。每种平台都会形成自己独特的机器指令,比如,某个平 台可能用8位序列代码10001111表示一次加法操作,以10100000表示一次减法操作,而另一种平台可能 用8位序列代码10101010表示一次加法操作,以10010011表示一次减法操作。程序需要由操作系统和处 理器来运行,因此,与平台无关是指程序的运行不因操作系统、处理器的变化导致发生无法运行或出现运行 错误的情况。 C/C++语言提供的编译器对 C/C++源程序进行编译时,将针对当前 C/C++源程序所在的特定平台进 行编译、连接,然后生成机器指令,即根据当前平台的机器指令生成机器码文件(可执行文件)。这样一来, 就无法保证 C/C++编译器所产生的可执行文件在所有的平台上都能正确运行,这是因为不同平台可能具有 不同的机器指令。 和 C/C++语言不同的是,Java语言提供的编译器不针对特定的操作系统和 CPU 芯片进行编译,而是 针对Java虚拟机,把Java源程序编译为被称作字节码的一种“中间代码”,比如,Java源文件中的“+”被编 译成字节码指令11110000。字节码是可以被Java虚拟机识别、执行的代码,即Java虚拟机负责解释运行 字节码,其运行原理是:Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台运行该机 器码。在一个计算机上编译得到的字节码文件可以复制到任何一个安装了Java运行环境的计算机上直接 使用。字节码由Java虚拟机负责解释运行,即Java虚拟机负责将字节码翻译成本地计算机的机器码,并将 机器码交给本地的操作系统来运行。 (3)注释 Java程序支持两种格式的注释:单行注释和多行注释。单行注释使用“//”表示单行注释的开始,即该 行中从“//”开始的后续内容为注释。多行注释使用“/*”表示注释的开始,以“*/”表示注释结束。编译器 读取注释内容,但注释内容不参加编译过程。添加注释的目的是方便代码的维护和阅读,因此给代码添加 注释是一个良好的编程习惯。 需要特别注意的 是,本 书 中 的 大 部 分 注 释 属 于 教 学 型 注 释 (语 法 型 注 释),不 是 开 发 型 注 释 (功 能 型 注释)。 教学型注释示例如下: int radius; //声明一个 int 型变量 开发型注释示例如下: int radius; //用于存放圆的半径 在实际项目开发中,应避免使用教学型注释。 (4)UTF-8 如果保存Java源文件时选择的编码是 UTF-8(源文件中使用了 GBK不支持的字符时),那么使用javac 8 编译源文件时必须显式用-encoding参数,告知编译器使用怎样的编码解析、编译源文件,即-encoding给出 的值必须和源文件的编码相同(不显式地使用-encoding参数,那么默认该参数的值是 GBK): C:\ch1>javac -encoding utf-8 Hello.java ANSI编码在不同的系统中代表 着 不 同 的 编 码。在 Windows简 体 中 文 系 统 下,ANSI编 码 代 表 GBK 编码,在 Windows日 文 系 统 下,ANSI编 码 代 表 JIS 编 码。GBK 编 码 共 收 录 了 21003个 汉 字,完 全 兼 容 GB2312,支持国际标准ISO/IEC10646.1和国家标准 GB13000.1中的全部中、日、韩文字(如日文的片假名 等),并包含了BIG5编码中的所有汉字。如果Java源文件中使用的字符没有超出 GBK支持的字符范围,保 存源文件时就将编码选择为 ANSI编码。文件保存到磁盘空间时,如果使用 ANSI编码,源文件中的汉字占 用2个字节,ASCII字符占用1个字节,如果使用 UTF-8编码,源文件中的汉字占用3个字节,ASCII字符 占用1个字节。 1.2.3 上机实践 (1)实验模板 请按模板要求将模板中注释的【代码】替换为Java程序代码。程序运行结果如图1-13所示。 public class MainClass { public static void main (String args[ ]) { 【代码 1】 //命令行窗口输出:你好,我是主类。 Tiger tiger = new Tiger(); Cat tom = new Cat(); tiger.speak(); tom.speak(); } }c lass Tiger { void speak() { 【代码 2】 //命令行窗口输出"老虎" } }c lass Cat { void speak() { 【代码 3】 //命令行窗口输出"I am Tom" } } 图1-13 模板运行结果 (2)实验模板【代码】参考答案 【代码1】 System.out.println("你好,我是主类"); 【代码2】 System.out.println("老虎"); 【代码3】 System.out.println("I am Tom"); 9 1.3 小结 (1)Java语言是面向对象编程,编写的软件与平台无关。Java语言涉及网络、多线程等重要的基础知 识,特别适用于Internet应用开发。很多新的技术领域都涉及Java语言,学习和掌握Java语言已成为相关 工作者的共识。 (2)Java源文件是由若干个书写形式互相独立的类组成。开发一个Java程序需经过三个步骤:编写源 文件、编译源文件生成字节码、加载运行字节码。 (3)Java源文件中最多只能有一个类是public类。源文件的名字必须与public类的名字完全相同,扩展名 是.java;如果源文件中没有public类,那么源文件的名字只要和某个类的名字相同,并且扩展名是.java即可。 (4)一个Java应用程序必须有一个主类。Java程序从主类开始运行,即Java命令执行的类名必须是主 类的名字(没有扩展名)。 1.4 课外读物 扫描二维码即可观看学习。 习题 1 1.判断题(题目叙述正确的,在后面的括号中打√,否则打×) (1)Java语言的主要贡献者是JamesGosling。 ( ) (2)Java源文件中只能有一个类。 ( ) (3)一个源文件中必须要有public类。 ( ) (4)源文件中如果有多个类,那么最多有一个类可以是public类。 ( ) (5)Java应用程序必须要有主类。 ( ) (6)Java应用程序的主类必须是public类。 ( ) (7)下列源文件可保存成dog.java。 ( ) public class Dog { public void cry() { System.out.println("wangwang"); } } 2.单选题 (1)下列是JDK提供的编译器的是( )。 A.java.exe B.javac.exe C.javap.exe D.javaw.exe (2)下列是Java应用程序主类中正确的 main方法的是( )。 A.publicvoidmain(Stringargs[]) B.staticvoidmain(Stringargs[]) C.publicstaticvoidMain(Stringargs[]) D.publicstaticvoidmain(Stringargs[]) (3)下列叙述是正确的是( )。 A.Java源文件由若干个书写形式互相独立的类组成 10 B.Java源文件中只能有一个类 C.如果源文件中有多个类,那么最少有一个类必须是public类 D.Java源文件的扩展名是.txt (4)下列源文件叙述正确的是( )。 A.源文件名字必须是 A.java B.源文件有错误 C.源文件必须命名为 E.java,编译无错误。有两个主类:E和 A。程序可以执行主类 E也可以执 行主类 A D.源文件中的 E类不是主类 public class E { public static void main(String []args) { System.out.println("ok"); System.out.println("您好"); } }c lass A { public static void main(String []args) { System.out.println("ok"); System.out.println("您好"); } } (5)下列叙述正确的是( )。 A.Java语言是2005年5月由 Sun公司推出的编程语言 B.Java语言是1995年5月由IBM 司推出的编程语言 C.Java语言的名字源于印度尼西亚一个盛产咖啡的岛名 D.Java语言的主要贡献者是比尔·盖茨 3.挑错题(A、B、C、D 注释标注的哪行代码有错误?) (1) public class Example1 //A { public static void main(String args[]) //B { System.out.println("ok"); //C System.out.println("hello"); system.out.println("您好"); //D } } (2) public class Example2 //A { public static void main(String args[]) //B { System.out.println("ok"); //C System.out.println("hello");