为何Java的main方法必须是public static void?

1、 voidhtml

  以下,C, C++同样,将返回值类型改成int,再返回一个0,虽然编译经过,可是运行时会报错。java

 

  找到一种可理解的解释:方法的反作用和返回值类型。(http://www.cnblogs.com/huanmin/p/6429778.html)程序员

  一个方法的执行,若是在返回一个值以外还致使某些外部“状态”发生变化,则称该方法产生了反作用。这里所谓“状态”发生变化,能够是实例域或静态变量被修改。函数

  1. 没有返回值的方法必有反作用,除非它的方法体是空的或者方法没有意义。因此,没有返回值的方法、有返回值但有反作用的方法称为过程;
  2. 有返回值并且没有反作用的方法称为函数(function)。

  因为Java的主函数是栈中最底层的函数,因此并不存在可以接收的值(没有谁能接收main的返回值),因此使用voidspa

但是为何Java不能像C, C++那样返回int型值?操作系统

  找到描述C语言main函数的调用过程:首先,咱们的程序进入到入口函数以前,是发生了不少事情的。操做系统的安排,启动运行时库,运行时库再初始化好环境,而后启动你的入口函数,你的程序才正常的运行起来。等你的程序运行结束后,就退回到运行时库,而后再退回到操做系统,而后系统再调度其余程序执行。(https://www.cnblogs.com/deanyuton/p/8227733.html).net

  由于main()不是由操做系统直接调用,因此返回类型不同也是能够理解的。能够认为运行时库就是操做系统和main函数的中间联系人,在C语言中由运行时库直接调用main函数,因此main函数的返回值也是运行时库接收。Java中,能够认为是操做系统→JVM→main函数这样的调用过程,JVM直接调用main函数,因此若是main函数有返回值,即JVM接收。可是JVM被设计为不接受任何返回值,因此main函数不能有返回值,只能void。设计

可是JVM为何不接受返回值?htm

http://www.javashuo.com/article/p-ttsuzfnp-nh.html(装载JVM)对象

https://www.cnblogs.com/iceAeterNa/p/4876940.html (深刻虚拟机)

 

2、 public

  一、去掉public关键字

 

  2public关键字改成protected

 

  三、public改成private

 

  编译警告The method main(String[]) from the type TestMain is never used locally

  public是函数的权限,决定了是否能够被外部函数调用,若是改成private,则只能是该main函数所在类的方法能够调用,在其余类中不可见protected规定子类和同一个包类可用,可是调用main函数的函数所在包和main函数所在包确定不在同一个包内,因此必须是publicC里面的函数是运行在操做系统环境中的,注意是运行时库调用main函数,可是整个C代码及运行时库都直接在操做系统中运行,可是Java的代码是运行在JVM中的,若是不限定public,JVM就没法调用main函数。(https://blog.csdn.net/echostream/article/details/44039169

  可是Java SE1.4之前是不强制main函数为public的。main方法不是public时,有些版本的java解释器也能够执行java应用程序。有个程序员报告了这个bug. 若是感兴趣能够查一下这个bug号码4252539.这个bug被标明“关闭”,不予修复。Sun公司的工程师解释说:java虚拟规范并无要求main方法必定是public。 好在,这个问题在 java SE1.4及之后的版本中强制main方法是public 最终的到了解决。(http://www.javashuo.com/article/p-uokhlhzh-nh.html

 

3、 static

 

  在C语言中,全部的函数均可以被直接调用,main函数至关于全局函数,但在Java中通常先要建立一个类的对象,再经过对象调用函数,可是在执行main函数以前建立一个对象显然是不可能的,由于JVM规定main函数为入口函数,从main开始执行static关键字就解决了这个问题,static关键字修饰的方法能够视为类方法,不须要建立对象就能够直接调用该方法。

 

4、 main方法重载

  main函数也能够重载,只要知足重载的条件便可。

 

相关文章
相关标签/搜索