第一章 Java语言概述及开发环境

1.1Java程序运行机制

1.1.1 高级语言的运行机制

计算机高级语言按照程序的执行方式可分为编译型解释型两种
编译型语言:使用专门的编译器,一次性编译成(特定平台上的)机器码,并包装成该平台(操作系统)所能识别的可执行性程序的格式,因此可以脱离开发环境独立运行,但是无法移植到其他平台运行。
注:有的程序编译完成后,还需要对其他编译好的目标代码进行链接生成最终的可执行性程序(这种形式可以实现低层次的代码复用)
解释型语言:使用某特定平台的解释器对源程序逐行进行解释成该特定平台上的机器码并立即执行的语言。通常不会进行整体性的编译和链接处理。
可以认为:每次执行程序都需要进行一次编译

1.1.2 Java程序的运行机制和JVM

执行Java程序的两个步骤:首先程序先经过编译(Windows命令窗口使用java命令)生成一种与平台无关的字节码(*.class文件,不能执行);然后使用Java解释器来解释(Windows命令窗口使用javac命令)执行(解释成特定平台的机器码)
JVM:Java虚拟机(Java Virtual Machine),负责解释执行字节码文件。所有平台上的JVM(不同平台上的JVM都是不同的)向编译器提供相同的编程接口,而编译器生成虚拟机能解释的代码(字节码),然后由虚拟机来解释执行。

1.2 开发Java的准备

背景:1、Sun在1996年年初发布了JDK 1.0,包括了两部分:运行环境(JRE)和开发环境(JDK)。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机5个部分;开发环境包括编译Java程序的编译器(即javac命令)。
2、Oracle把Java分成Java SE(Java Standard Edition,Java 标准版)、Java EE(Java Java Enterprise Edition,Java企业版)、Java ME(Java Micro Edition,Java微型版)三个部分,而且为Java SE和Java EE分别提供了JDKJava SDK(Software Development Kit)两个开发包。

1.2.1 下载和安装Java8的JDK(以Windows平台为实例)

JDK:Java标准版开发包(Java SE Development Kit),它提供了编译、运行Java程序所需要的各种工具和资源,包括Java编译器、Java运行时环境(JRE),以及常用的Java类库等。
JRE:Java运行时环境(Java Runtime Environment)。

下载可百度,下面只有注意事项及一些目录解释。

安装时:
1、不需要安装Public JRE,因为公共JRE一个独立的JRE系统,会单独安装在系统的其他路径下。公共JRE会向IE浏览器和系统中注册Java运行时环境。通过这种方式,系统中任何应用程序都可以使用公共JRE。由于现在网页上执行Applet的机会越来越少,而且完全可以选择使用JDK目录下JRE来运行Java程序,因此没有必要安装公共JRE。
2、Development Tools:这是JDK的核心,包括编译Java程序必需的命令工具。这个选项里包含了运行Java程序的JRE,这个JRE会安装在JDK安装目录的子目录里,这也是无需安装公共JRE的原因。
3、Source Code:安装这个选项将会安装Java所有核心类库的源代码。
4、选择JDK的安装路径,系统默认安装在C:\Program Files\Java路径下,但不建议安装在有空格的路径下,这样可能导致一些未知的问题,建议直接安装在根目录下,例如D:\Java\jdk1.8.0_05\。
安装完成后,可在JDK安装路径下看到如下的文件路径。
1、bin:该路径下存放了JDK的各种工具命令,常用的javac、java等命令。
2、db:该路径是安装Java DB(database)的路径。
3、include:一些平台特定的头文件。
4、jre:改路径下安装的就是运行Java程序所必需的JRE环境
5、lib:改路径下存放的是JDK工具命令的实际执行程序
补充说明:用于编译Java程序的javac.exe命令是使用Java编写的,这个类就是lib路径下tools.jar文件的sun\tools\javac路径下的Main类,JDK的bin路径下的javac.exe命令实际上仅仅包装了这个Java类。不仅如此,bin路径下的绝大部分命令都是包装了tools.jar文件里的工具类。
6、javafx-src.zip:该压缩文件中存放的就是Java FX所有核心类库的源代码。
7、src.zip:该压缩文件中存放的是Java所有核心类库的源代码。
8、README和LICENCE等说明性文档

1.2.2 设置PATH环境变量(具体可百度)

虽然计算机中已经安装了JDK,但此时还不能使用java和javac命令,因为计算机不知道去哪找着两个命令。
Windows操作系统(不区分大小写)是通过Path环境变量来查找命令的,Path环境变量的值是一系列路径,所以只需要把java和javac两个命令所在的路径添加到PATH环境变量中,就可以编译和运行Java程序了。(Linux也是,只是Linux区分大小写,所以Linux的path只能大写)。
Windows系统添加环境变量:
右击桌面上的“计算机”图标,单击“属性”,出现“控制面板\所有控制面板项\系统”窗口,单击“高级系统设置”,出现“系统属性”对话框,单击“高级”tab页,单击“环境变量”,出现“环境变量”对话框,因为path的系统环境变量已经存在,所以直接编辑。选中(单击)用户变量中的path,然后点击“编辑”,出现一个对话框,点击新建,设置path环境变量的值为D:\Java\jdk1.8.0_05\bin,保存即可。

补充说明:为什么是添加到用户变量中呢?用户变量和系统变量并没有太大区别,用户变量只对当前用户有效,而系统变量对所有用户都有效。使用用户变量是为了减少自己所在的修改对其他人的影响。(对于当前用户而言,两者效果差不多)。系统变量的路径排在用户变量的路径之前。这可能出现一种情况:如果Path系统变量的路径里包含了java命令,而PATH用户变量的路径里也包含了java命令,则优先执行Path系统路径里包含的java命令。
Linux 中添加环境变量:
1、进入当前用户的home路径下,输入命令:

ls -a

该命令列出当前目录下的全部文件,包括隐藏文件,Linux平台的环境变量是通过.bash_profile文件来设置的。
2、使用无格式编辑器打开该文件,在该文件的PATH变量后添加JDK的安装路径。
#设置PATH环境变量

PATH=.:$PATH:$HOME/bin:JDK的安装路径

Linux平台使用冒号作为多个路径间的分隔符,$PATH则用于引用原有的PATH变量值。
3、完成了PATH路径值的设置后,在.bash_profile文件最后添加导出PATH变量的语句

#导出PATH环境变量
export PATH

4、重新登录Linux平台或是执行命令(运行该文件,使文件中设置的PATH变量值生效)

source .bash_profile

1.3 第一个java程序

1.3.1 编辑Java源代码

注:编写Java程序不要使用写字板,更不可使用Word等文档编辑器。因为它们是有格式的编辑器,使用它们编辑一份文档时,文档中会包含一些隐藏的格式化字符,这些隐藏字符会导致程序无法正常编译、运行。Windows中可以使用记事本(NotePad)、EditPlus等,Linux中可以使用VI工具等。

打开记事本,第一个程序HelloWorld诞生啦

public class HelloWorld
{
	//Java程序的第一个入口方法,程序将从这里开始执行
	public static void main(String[] args)
	{
		//向控制台打印一条语句Hello World!
		System.out.println("Hello World!");
	}
}

将文本文件保存为HelloWorld.java,该文件就是Java程序的源程序。接下来就是将源程序编译生成字节码了。

1.3.2 编译Java程序

在Windows命令窗口输入javac,提示javac命令的用法
javac命令的用法:
用法: javac <options> <source files> 其中, 可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖所安装扩展的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-proc:{none,only} 控制是否执行注释处理和/或编译。
-processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
-processorpath <路径> 指定查找注释处理程序的位置
-parameters 生成元数据以用于方法参数的反射
-d <目录> 指定放置生成的类文件的位置
-s <目录> 指定放置生成的源文件的位置
-h <目录> 指定放置生成的本机标头文件的位置
-implicit:{none,class} 指定是否为隐式引用文件生成类文件
-encoding <编码> 指定源文件使用的字符编码
-source <发行版> 提供与指定发行版的源兼容性
-target <发行版> 生成特定 VM 版本的类文件
-profile <配置文件> 请确保使用的 API 在指定的配置文件中可用
-version 版本信息
-help 输出标准选项的提要
-A关键字[=值] 传递给注释处理程序的选项
-X 输出非标准选项的提要
-J<标记> 直接将 <标记> 传递给运行时系统
-Werror 出现警告时终止编译
@<文件名> 从文件读取选项和文件名

对于初学者而言,先掌握javac命令用法如下:

javac -d destdir srcFile

在上面的命令中,-d destdir 是javac命令的选项,用以指定编译生成的字节码文件的存放路径,destdir只需是本地磁盘上的一个有效路径即可;而srcFile是Java源文件所在的位置,可以是绝对路径,也可以相对路径。
通常,总是将生成的字节码文件放在当前路径下,当前路径可以用(.)来表示。在命令行窗口进入HelloWorld.java文件所在路径,在该路径下输入命令:

//编译HelloWorld.java 文件
javac -d . HelloWorld.java

执行该命令后,在该路径下生成一个HelloWorld.class文件。

1.3.3 运行java程序

运行Java程序使用java命令,进入HelloWorld.class在Windows命令窗口输入java,提示java命令的用法。
初学时,先掌握java命令的如下用法:

java Java类名

注:java 命令后面的参数是Java类名不是字节码文件的文件名,也不是Java源文件名。
通过命令窗口进入HelloWorld.class所在的路径,输入命令:

//注意大小写
java HelloWorld

运行成功后,将看到输出:

Hello World!

1.3.4 根据CLASSPATH环境变量定位类

如果是1.5版本以上的JDK,完全可以不用设置CLASSPATH环境变量。当我们使用java命令来运行java程序时,JRE在当前路径下寻找Java类,1.4以前的版本没有设置这个功能,则需要在CLASSPATH环境变量中添加一点(.),用以告诉JRE在当前路径下搜索Java类。除此以外,编译和运行Java程序还需要JDK的lib路径下的dt.jar和tools.jar文件中的Java类,因此还需要把这两个文件添加到CLASSPATH环境变量中去,CLASSPATH 环境变量的值为

.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

(其中%JAVA_HOME%代表JDK的安装目录)

当然,如果1.5版本以上的JDK想要设置也是可以的,但一旦设置了该环境变量,JRE将会按照该环境变量指定的路径来搜索Java类。因此,如果在CLASSPATH环境变量中不包括一点(.),也就是没有包含当前的路径,JRE就不会在当前路径下搜索Java类。(所以修改的时候一定记得在CLASSPATH环境变量中添加一点
如果想在运行Java程序时临时指定JRE搜索路径,则可以使用-classpath选项,如下:

java -classpath dir1;dir2...;dirN Java类

-classpath选项的值可以是一系列的路径,多个路径之间在Windows中使用分号(;)隔开,Linux中使用冒号(:)隔开。
如果在运行Java程序时指定了-classpath选项的值,JRE将严格按照-classpath指定的路径来搜索Java类,即不会在当前路径下搜索,此时CLASSPATH环境变量所指定的搜索路径也不再有效。

如果想使CLASSPATH环境变量指定的搜索路径有效,而且还会在当前路径下搜索Java类,则可以按照如下方式来运行Java程序:

java -classpath %CLASSPATH%;.;dir1;dir2...;dirN Java类

通过%CLASSPATH%来引用CLASSPATH环境变量的值,并在-classpath选项的值里面添加了一点(.),强制JRE 在当前路径下搜索Java类。

1.4Java程序的基本规则

1、如需某个类能被解释器直接解释执行,则这个类中必须包含main方法,且main方法必须使用public static void 来修饰,且main方法的形参必须是字符串数组类型(String[] args是字符串数组形式)。
2、Java程序源文件的后缀必须.java
3、在通常情况下,Java程序源文件的主文件名可以是任意的。但是有一种情况例外:如果Java程序源代码中定义了一个public类,在该源文件的主文件名必须与该public类的类名相同
4、严格区分大小写。
5、安装JDK以及Java相关程序、工具时,不要安装在包含空格的路径里,否则可能引发错误。