Java文件的命名,Java主类,Java中的public类

编译和运行 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讲义》

  • 38
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,Java文件如果含有主类主类必须是public。在Java,一个源文件可以包含多个,但只能有一个public,并且public的名称必须与源文件名相同。这是因为Java虚拟机在执行程序时需要找到public,并从该的main方法开始执行程序。如果主类不是public,那么Java虚拟机将无法找到它,因此程序将无法执行。 ### 回答2: 在Java,如果一个源文件包含了一个主类(也就是含有main()方法的),则这个主类必须被声明为public。这是由于Java命名规范和访问控制的要求。 首先,Java命名规范要求源文件名必须与主类名相同,并且使用.java作为文件扩展名。如果主类不是public,那么在编译源文件时会产生错误,因为编译器无法找到与文件名匹配的public。 其次,Java的访问控制规范要求,主类必须是public,以便其他能够访问和使用它。如果主类不是public,那么在其他源文件无法通过名来引用该主类,从而导致无法调用main()方法。 需要注意的是,一个源文件只能有一个public,而可以有多个非public。非public在同一个包的其他可以访问和使用它们,但在不同包无法访问非public。所以如果希望在其他包能够调用主类的main()方法,就必须将主类声明为public。 总结而言,Java文件如果含有主类主类必须是public。这是为了符合Java命名规范和访问控制规范,以便能够正常编译和调用主类的main()方法。 ### 回答3: Java文件如果含有主类主类必须是public。这是因为Java程序的执行入口是主类的main方法,而主类被设计为public是为了确保该能够被其他或程序访问到。如果主类不是public,那么其他或程序将无法找到并执行该主类的main方法。 当一个Java程序被编译并运行时,Java虚拟机(JVM)会自动寻找并执行包含main方法的主类。因此,主类必须被定义为public,以便JVM能够正确地加载和执行该。如果主类不是public,则JVM将无法访问主类,也无法找到其的main方法,因而无法启动程序的执行过程。 除了主类必须是public外,源文件还可以包含其他非public。这些非public可以被主类或其他所使用,但不可以被其他程序或直接访问。这样设计的好处是能够将代码逻辑进行模块化,提高代码的可读性和可维护性。 总之,Java文件含有主类时,主类必须是public,以确保Java虚拟机能够找到并执行主类的main方法,从而启动程序的执行过程。这是Java程序的基本规则之一,需要在编写Java文件时严格遵守。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值