二、JRE及输入输出
- 1. Java程序的运行原理
- 2. 程序入口与输入输出
- 2.1 Java程序的入口——main()方法
- 2.2 输入输出
注:以下操作和命令仅基于Windows系统
1. Java程序的运行原理
- 一个Java程序是怎样运行的呢?
首先,Java程序执行需要经过编译、运行两个步骤,分别对应javac和java两个命令。javac命令就是将Java源文件(也就是.java文件)进行编译,生成对应的字节码文件(也就是.class文件),而java命令就是运行.class文件。在此过程中,需要注意的是:
(1) 编译生成的.class文件默认放在当前文件夹下,当然也可以指定存放的位置。以HelloWorld.java为例:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
在终端窗口中输入以下编译命令:
javac -d . HelloWorld.java //或者为:javac HelloWorld.java
其中,-d destdir(此例中.代表当前文件夹),编译命令的常用格式为:
javac -d destdir srcFile
其中,destdir为想要指定的.class文件的存储位置,只要是磁盘上的有效路径即可;srcFile为Java源文件所在的位置,可以是绝对路径,也可以是相对路径,默认在当前路径下。需要注意的是,两者的路径均需要放在英文双引号之内。
(2) 编译生成的.class文件有默认的文件名,即总是以源文件所定义的类名作为主文件名。当一个源文件内定义了多个类时,将编译生成多个.class文件,比如在类A里定义了一个类B,那么将生成两个.class文件:A.class和A$B.class。
(3) Java源文件经编译后,便可以等待被调用或者作为主程序运行。若作为主程序运行(也就是包含 main() 方法),则可以在命令行窗口进入主程序所在的路径,然后输入运行命令:
java HelloWorld
- 值得注意的是,java命令后直接跟上主类名即可。
- 若主程序需要调用其他的类或者引用第三方jar包,一种妥善的做法是,指定jar包所在的位置(也就是临时指定CLASSPATH的搜索路径),并将需要调用的其他类与主程序放在同一文件夹下,以运行Flips为例,其需要调用其他类,并且需要引用第三方jar包和指定输入参数,具体命令如下:
java -classpath ".;E:\zp\study\algs4.jar" Flips 1000000
以上,-classpath是运行命令的参数选项,可以简写为-cp,搜索路径之间用 ; 隔开,并放在英文双引号之内,Flips为包含 main() 方法的类,1000000为Flips类中 main() 方法需要输入的参数。
2. 程序入口与输入输出
2.1 Java程序的入口——main()方法
main() 方法的一般定义为:
public static void main(String args[]){...}
- 为了可以让JVM自由调用,将 main() 方法的访问权限定为public(公共访问权限)。
- static表明 main() 方法属于主类,JVM调用 main() 时可以直接通过该类来调用而不用再另外创建一个对象。
- 因为 main() 方法的返回值将返回到JVM,这没有任何意义,因此void表明 main() 方法没有返回值。
- main() 方法的形参args为String数组,args由JVM来进行传值,其来源可以是命令行输入(也可以是标准输入流),如上述运行Flips类时,其后跟的参数1000000。当然,实际传入的参数也可以来源于重定向和管道,如:
- 重定向:
java -classpath ".;E:\zp\study\algs4.jar" Flips < data.txt
这条命令会从文件data.txt 中读取Flips中 main() 方法所需要的实际参数。
- 管道:
java Data | java -classpath ".;E:\zp\study\algs4.jar" Flips
其中,运行java Data
会产生Flips中 main() 方法所需要的实际参数。
2.2 输入输出
下图为Java程序整体结构:
(1) 相对于终端窗口,其输入可以来源于标准输入流、文件、命令行参数;输出可以为标准输出流、文件、标准绘图等。管道及重定向已在之前讲过,在此不再赘述。
(2) Java提供了强大的输入输出库,可自行查看相应的API。
————to be continued