概述
Java中的main方法,是一个java应用程序的入口,无论一个java的应用多么复杂庞大,或是多么的小,只要他是一个可以运行的java程序那么必然就要有一个main方法。main方法的定义格式通常固定如下:
public static void main(String[] args){
}
我们可以在方法签名当中加上final关键字,也可以修改方法的参数的定义方式,但无论如何,一个main方法必须要是static的,返回类型为void的,且是public的。为什么java中的main方法要这么设计和规定呢?下面我们就围绕以下三个问题来分析java中的main方法。
为什么main方法必须是static的?
关于static关键字我们知道的是,static关键字修饰的方法,可以不用通过创建一个类的实例,而是直接通过类名直接去访问。例如下面代码中调用methodA这样:
public class TestA{
public static void methodA(){
}
public void methodB(){
TestA.methodA();
}
}
并且, 从内存角度来说static修饰的方法以及变量存储在虚拟机当中的方法区当中,而非堆内存当中。
那么,对于虚拟机来说也是一样的道理。main方法定义为static的,则对于虚拟机来说,在程序启动之后并不需要创建一个实例,也就可以去调用这个main方法。
而如果main方法不定义为static的话,虚拟机就需要设计成去new一个包含main方法的类的实例,再去调用这个main方法。这个时候就会存在一个问题,若这个类存在不止一个构造方法,虚拟机是无法决定使用哪个构造方法去创建实例的。
当然,从我个人理解的角度,java虚拟机可以实现为解析非static的main方法,因为它可以规定自己使用默认的构造方法去初始化一个类,然后再去调用main方法即可,只是这相对而言会麻烦一些。从这个层面来讲我们也可以认为这是java虚拟机的一个约定。
为什么main方法必须是void的?
void是java的main方法的返回值,理解返回值应该从方法调用者的角度去理解,java的main方法的调用者是java虚拟机,而java虚拟机在启动java程序时,只需要调用main方法,而不需要此方法返回任何的值,因此,main方法被设计为void的。
为什么main方法必须是public的?
Java设计了几个访问修饰符,包括:private,protected,public。 在Java中声明为public的任何方法或变量都可以从该类的外部访问。 而JVM访问main方法显然不是在类的内部访问,因此main方法需要定义为public的方法。
其他
从java诞生的历史背景来看,有的问题就会更好理解。写过c语言程序的话,就会发现java的main方法定义事实上和c语言是十分相似的,而c语言的main方法就是需要用static关键字修饰。从这一角度也可以说Java这门语言在诞生之初本来就是故意设计成C程序员熟悉的。
网友评论