Java main()方法剖析
从语法上对main方法的理解
从JVM角度:
- 由于JVM需要调用类的main()方法,所以该方法的访问权限必须是
public
, - 又因为JVM在执行main()方法时不必创建对象,所以该方法必须是
static
的, - 该方法接收一个String类型的数组
参数
,该数组中保存执行Java命令时传递给所运行的类的参数。
从Java语法角度:
- 又因为main() 方法是
静态的
,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。
一个面试题
此处,Something类的文件名叫OtherThing.java,该程序是否可以正常编译、运行?
class Something {
public static void main(String[] something_to_do) {
System.out.println("Do something ...");
}
}
肯定是可以的,但是如果这个类是public
的就不行。
解析如下:
- Java保存的文件名必须与类名一致;
- 如果文件中只有一个类,文件名必须与类名一致;
- 一个Java文件中只能有一个public类;
- 如果文件中不止一个类,public类名必须与文件名一致;
- 如果文件中不止一个类,而且没有public类,文件名可与任一类名一致。
当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也称为转译单元)。每个编译单元都必须要有一个后缀为.java,而在编译单元内测可以 有一个public类,该类的名称必须与文件名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译 器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为他们不是public类,而且他们主要用来为主要 public类提供支持。
- 每个编译单元(文件)都只能有一个public类。 这表示,每个编译单元都有单一的公共接口,用public类来表现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出出错信息。
- public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。所以对于Widget而言,文件的名称必须是Widget.java,而不是widget.java或WIDGET.java。如果不匹配,同样将得到编译时错误。
- 虽然不是很常用,但编译单元内完全不带public类也是可能的。这种情况下,可以随意对文件命名。(尽管随意命名会使得人们在阅读和维护代码时产生混淆。)
一个Java文件可以有多个类作为内部类/Adapter类/其它类,但是只能有一个public类,且类名必须和文件名一致。这是这类语言的一个不好的地方。
在现实情况中,经常有一些很小的类由几个类共同需要,因此无法作为内部类,而且接口关系必须设置为public,这样就导致了大量很小的.Java程序,每个都只有几百字节。
这类语言的另一个问题是一个类的所有实现的方法都必须包含在同一个文件中。在swing应用程序中,经常导致长达一两百K字节的源程序,行数达到三四千行,搞得JBuilder奇慢无比。
一个 .java 文件,可以有多个类,但是文件名只能有一个,用哪一个类名来充当文件名呢?其实文件名是无所谓的,因为将来用 javac 进行编译的时候,最终会生成多个 .class 文件,每一个类对应个 .class 文件。运行时只要运行对应的 .class 文件就可以了,这时 .java 文件就显得没什么用了( 运行时不需要 ),那还管它叫什么名字。
但是当你的类被 public 修饰时,此时文件名必须和该类保持一致(例如 public class A{} 只能放在 A.java 文件中,不然在用 javac 编译时会提示错误:类 A 是公共的,应在名为 A.java 的文件中声明)。也就是说在同一个 .java 文件中,不应该出现2个或2个以上的 public class 。
如果有一个public class类,就应该让文件名和此类名相同;那如果没有呢,即所有的 class 都没有修饰符,那么可以给该文件随便起名字,甚至可以不和任意一个类同名,哪怕是汉字名称都可以,但是后缀还是要有.java 的 。
注:有很多初学者 ( 我也是 ) 可能会认为文件名应该也和 main 方法所在类有关系,其实不然。main 方法只是程序的一个入口,老师讲“一个程序只能有一个入口”,好象是在说只能有一个 main 方法,其实,只要你高兴,就可以在所有类里都写上 main 方法,给程序提供N多个入口,但是最后你运行程序的时候也只能从其中的一个入口进去,这就是 main 的作用( 程序入口 )。(这也就是为什么你会发现,程序员在做单元测试时,会往自己做的很多类里面添加 main 方法,因为他要为自己做的东西添加运行入口,从而能方便测试。)
相关文章
- java线程join方法
- java vo 什么意思_在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
- fileinputstream java_Java FileInputStream close()方法
- java判断一个对象是否为空_Java中判断对象是否为空的方法的详解
- JAVA环境配置
- java中的compareto方法的详细介绍
- java出现中文乱码_Java开发中中文乱码总结
- java数组去重_JAVA数组去重常用方法
- java后台怎么解密md5,Java md5 密码加解密
- java dom4j 添加节点_Java dom4j获取,添加,删除,查找,设置Element节点方法「建议收藏」
- pytest的使用_java直接调用方法
- 【说站】java反射三种方法
- java的栈内存和堆内存_Java本地方法栈
- java 异或加密_Java异或技操作给任意的文件加密原理及使用详解
- Java方法重载_java入门方法的使用
- 【错误记录】Android Studio 4.2.1 编译报错 ( 设置支持的 Java 和 Kotlin 版本 | java.lang.BootstrapMethodError )
- Linux下Java开发:给初学者的指引(linux下java编程)
- java.lang.NoClassDefFoundError: org/springframework/dao/support/PersistenceE解决方法详解编程语言
- Java Set.contains()方法:判断Set集合是否包含指定的对象
- 服务器上的文件Java获取Linux服务器文件:简单又高效的操作方法(java获取linux)
- Java设置Redis过期时间的简单方法(redisjava过期)
- 运行Linux中定时运行Java程序的实用方法(linux定时java)
- 程序Oracle调用Java程序的实现方法(oracle调用java)
- Java程序如何在Linux上顺利部署?快来了解一下!(java部署到Linux)
- Linux系统中下载Java的方法(linux下java下载)
- java中Servlet处理乱码的方法
- Java中典型的内存泄露问题和解决方法
- java获取当前路径下的所有xml文档的方法