1. JAVA的是如何执行的?
Java最大的特性就是跨平台,所以它的运行平台更复杂些。Java文件经过编译后生成的是一个扩展名为.class的文件,这个文件就是可执行的字节码文件,它不包含当前的硬件信息。当字节码文件被执行时,再由JVM(Java虚拟机)把字节码解释成具体平台上的机器执行执行。
Java运行系统执行Java应用程序的过程包括三个步骤:代码装入、代码验证、代码执行。如下图
- 代码的装入是由类装配器完成,它主要负责装入程序运行时所需要的全部代码,包括程序运行中调用到的其他类。当类装配器装入一个类后,该类被放在自己的命名空间中,除了通过符号引用其他类之外,该类不能影响其他类所在的命名空间。当装入了运行程序所需要的所有类后,运行系统就能确定整个可执行程序的内存布局。
-
被装入的代码由字节码验证器进行安全检查,以确保字节代码不存在违反访问权限、不规范的数据类型和非法调用等问题。
-
通过校验之后,代码就可以运行了。JAVA的字节码运行方式有两种:
解释执行方式:通过“解释器”,将字节码翻译成机器码,然后由“运行执行器”将机器码送往硬件执行。整个执行过程是一边翻译一边执行,称为解释执行。
即时编译方式:通过“代码生成器”,先一次性地将所有字节码翻译成适用于特定计算机系统的机器码,然后送往硬件执行。对程序运行速度要求高时,一般采用这种方式。
2. JAVA的编译和执行命令
JDK安装完毕后,在安装路径下有这么几个文件夹:
- bin:存放编程所要用的开发工具,包括编译器、解释执行程序、小应用程序浏览器、调试器、文档生成器、反编译等。
- demo:存放演示程序,开发者可以从中学习如何使用JAVA的类库;
- include:存放本地文件(Native Means);
- jre:Java运行环境的根目录,存放JVM所需要的各种文件;
- lib:存放库文件;
- sample:类似demo文件件,存放用于学习的源代码,多数与网络有关;
编译命令javac
javac命令在bin目录,格式如下:
javac [-选项] filename.java ...
其中filename.java是要编译的源文件,必要参数,[-选项]为可选项,可以通过命令行敲入javac回车能看到很多选项说明。
[-选项]中有一项"-classpath <路径>",很重要,它的含义是在编译中要用到的.class文件路径,路径可以有多个用";"号分隔,和环境变量设置类似,如编译文件HelloWorld.java文件,首先在命令行进入bin目录,编译格式如下:
javac -classpath D:\Java\jdk1.7.0_05\lib D:\mytemp\java\HelloWorld.java
编译成功,不显示任何信息,因为JAVA遵循“没有消息便是好消息”的原则。在HelloWorld.java目录下生成了HelloWorld.class字节码文件。
解释执行命令java
java命令也在bin目录,它是将编译好的class加载到内存,然后调用JVM来执行它,它的格式有两种:
java [-选项] class [参数...] java [-选项] -jar jarfile [参数...]
执行class时不用带扩展名。
在命令行敲入java回车也能看到很多选项说明,其中也有"-classpath <路径>",它的含义是执行时要用到的.class文件路径。如:
java -classpath . HelloWorld
3. 使用环境变量
环境变量是包含于系统及当前登录用户的环境信息字符串,一些程序在执行时使用这些信息来确定何处放置或搜索文件。和JDK有关的环境变量有两个:path和classpath。
- path用于何处搜寻JAVA开发工具,即bin目录下的工具,所有在path环境变量中添加bin路径,如";D:\Java\jdk1.7.0_05\bin";这样在使用javac、java命令时就不必先进入bin目录,可以在任何路径下使用javac和java命令,因为系统会自动去搜索。
- classpath用于指定执行命令时所需要的.class文件目录,执行javac命令时需要JDK类库,所以给classpath添加lib目录路径,如:";D:\Java\jdk1.7.0_05\lib",当编译成功后会在源文件目录生成字节码.class文件,一般会在.class文件路径下使用解释执行命令java,所以还要在classpath里添加";.",代表当前目录,我当时犯的错就是少配置了当前目录,但如果你不配置就需要在执行java命令时使用classpath参数了。