编译和运行 Java 程序
HelloWorld.java 文件:
// HelloWorld.java
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
运行该命令后会生成一个 HelloWorld.class 文件:
javac HelloWorld.java
- 使用javac编译文件无需指定字节码文件的文件名。javac 编译后生成的字节码文件会以 源文件定义的类的类名 为主文件名,".class"作为扩展名。
- 如果一个源文件里定义了多个类,将编译生成多个字节码文件。
在 HelloWorld.class 存放路径下,运行如下命令,即可运行 java 程序。
java HelloWorld
java 命令后面跟的是 类名。不是字节码文件的文件名,也不是Java源文件名。
PS:此处相同只是巧合而已。当然也是习惯使然,习惯类名和文件名一样。
想想在 eclipse 里新建 Java class 的时候,填入一个类名,文件名会自动和类名保持一致。
Java 程序的组织形式
类是Java程序的最小程序单位
- Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类的形式存在,类是Java程序的最小程序单位。
- Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。
main 方法是程序执行的入口
- main 方法写法固定:必须被 public static void 修饰,且其形参必须是字符串数组类型(String[] args)。
- JVM 从 main 方法开始解释执行,因此 main 是Java 程序的入口。
- 对于一个大型 Java 程序,往往只需要一个入口(即只一个类包含 main 方法),其他类用于被 main 方法直接或间接调用。
为什么main方法必须写成public static void main(String[] args) 形式?
这个问题待解决,后面再补充。
相关测试:
在eclipse里新建类的时候,如果没有main方法或者没有按照标准main方法格式书写,控制台会显示“找不到main方法”。
如果main所在的类没有被public修饰,也是可以正常运行的。
class Solution1 {
public static void main(String[] args) {
System.out.println("---");
}
}
Java 源文件的命名规则
- 通常情况下,Java 程序源文件的主文件名可以任意。
- 但如果其中定义了一个 public 类,则该源文件的主文件名必须与该 public 类的类名相同。
- 一个Java 源文件可包含多个类定义,但最多只能包含一个public类定义。
为什么只能包含一个public类?
因为 public 类可以被项目中其他包下的类访问到。只需要在使用前 import 其对应的 class 文件。将类名与文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。
当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元)。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要用来为主public类提供支持。
1、Java编译器在编译的时候,如果整个Java文件(编译单元)都没有public类(对外的公开接口类),类加载器就无需直接去加载该编译单元产生的所有的字节码文件(.class文件),那么也就是无需去寻找编译后字节码文件存放位置。而类名和文件名一致是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件。所以在没有public类的Java文件中,文件名和类名都没什么联系。
2、如果编译单元中包含了public类,那么该类对应的字节码文件需要被类加载器加载的,这时候就需要让类加载器知道该字节码文件的位置,所以就要确保该类与Java文件名称一致。同时,如果有两个public类在同一个文件中,而一个文件只能有一个名称,故两个public类的名称就不能同时和文件名一样,这就造成至少其中有一个public类在编译的时候编译不通过。
关于Java源文件命名,通常有以下建议:
- 一个 Java 源文件只定义一个类,不同的类使用不同的源文件定义。
- 让 Java 源文件的主文件名与该源文件中定义的 pulblic 类同名。
主类
类的名字和文件名一致,并且包含main函数的类,叫做主类。
所谓主类是程序的入口,要让JVM能找到执行的入口,必须:
- 类名字和文件名一致
- 包含public static void main(String[] args) {}
注意该类并不需要一定有public修饰,前面有测试过。
在 Solution1.java 文件中定义如下:
class Solution1{
public static void main(String[] args) {
System.out.println("Solution1");
}
}
class Solution2{
public static void main(String[] args) {
System.out.println("Solution2");
}
}
根据运行结果可以看到执行了Solution1的main方法:
Solution1
如果把上面 Solution1 和 Solution2 两个类名分别改成 Demo1 和 Demo2,则会出现错误如下:
这个测试说明光有 main 方法是不够的,还得和文件名一致。
参考:
主类部分:https://zhidao.baidu.com/question/17186821.html
关于 public 类:https://www.cnblogs.com/fuhongliang/p/4304477.html
其他部分参考:《疯狂Java讲义》