有时候,我们会遇到关于主类,类和public修饰的类的辨析。刚开始,很难辨别。那么,接下来,简要地分析一下其区别:

1.如果文件中只有一个类,文件名必须与类名一致,有没有public修饰都可以;

2.一个Java文件中最多只能有一个public类;

3.如果文件中不止一个类,而且有public类,文件名必须与public类名一致;

4.如果文件中不止一个类,而且没有public类,文件名可与任一类名一致。(相同的是主类)

首先:

类是Java程序的最小程序单位

  • Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类的形式存在,类是Java程序的最小程序单位
  • Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里(不能像c,c++一样瞎写了)

主类:

什么是主类?

一说,类名与文件名相同,且含有main的类。

一说: 是带有(总程序的)执行入口main方法的类。 (虚拟机第一个进入的类)

那么:我们不妨思考一下:

Q: 一个类是不是可以有多个main方法呢?

A: 由于java语言的多态性,我们完全可以在一个类中含有多个main方法,但记住,main是入口,而这些main方法中只有一个才会是入口。

main 方法写法固定:必须被 public static void 修饰,且其形参必须是字符串数组类型(String[] args)。
对于一个大型 Java 程序,往往只需要一个入口(即只一个类包含 main 方法),其他类用于被 main 方法直接或间接调用。

Java 源文件的命名规则

  • 通常情况下,Java 程序源文件的主文件名可以任意。
  • 但如果其中定义了一个 public 类,则该源文件的主文件名必须与该 public 类的类名相同
  • 一个Java 源文件可包含多个类定义,但最多只能包含一个public类定义

为什么只能包含一个public类?

因为 public 类可以被项目中其他包下的类访问到。只需要在使用前 import 其对应的 class 文件。将类名与文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。

1、Java编译器在编译的时候,如果整个Java文件(编译单元)都没有public类(对外的公开接口类),类加载器就无需直接去加载该编译单元产生的所有的字节码文件(.class文件),那么也就是无需去寻找编译后字节码文件存放位置。而类名和文件名一致是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件。所以在没有public类的Java文件中,文件名和类名都没什么联系。

2、如果编译单元中包含了public类,那么该类对应的字节码文件需要被类加载器加载的,这时候就需要让类加载器知道该字节码文件的位置,所以就要确保该类与Java文件名称一致。同时,如果有两个public类在同一个文件中,而一个文件只能有一个名称,故两个public类的名称就不能同时和文件名一样,这就造成至少其中有一个public类在编译的时候编译不通过。

关于Java源文件命名,通常有以下建议:

一个 Java 源文件只定义一个类,不同的类使用不同的源文件定义。
让 Java 源文件的主文件名与该源文件中定义的 pulblic 类同名。