Java main方法

参考自:

https://blog.csdn.net/show_me_the_world/article/details/47106191
https://blog.csdn.net/show_me_the_world/article/details/47106191

背景

      来公司接触java也一年多了,虽然最近才开始真正系统性的学习,但是之前也断断续续用java写过代码。心里一直有个疑惑:我发现公司项目里比如用springmvc框架搭建的,代码里几乎没看到过public static void main(String[] args),全是注解。但是,为什么看书上的例子,运行测试类时都要有一个main方法呢?这个main方法到底是什么啊?
      由于本人技术有限,只能百度去找答案了。虽然在开发中不需要关注这些,但是了解下为什么总归也不错的。

网上讲解

      main方法是我们学习Java语言学习的第一个方法,也是每个java使用者最熟悉的方法,每个Java应用程序都必须有且仅有一个main方法
      可以说main方法是最简单的方法,因为main方法几乎是固定不变得,除了String[] args可以写成String args[],以及args的名称可以改变外,其它所有均不改变。main方法也是特殊的,因为它的类型必须是public static void,甚至名字都必须是main,还有括号内的参数String[] args
      根据Java语言规范,main方法必须声明为public。但是在JavaSE1.4以前的版本中,当main方法不是public时,有些版本的Java解释器也可以执行Java应用程序。详见 http://bugs.sun.com/bugdatabase/index.jsp ,bug号码4252539。当时SUN公司的工程师解释说,Java虚拟机规范并没有要求main方法一定是public。以上只是写出来,丰富一下兴趣。如果有人说Java main方法从来只能用public,那样说实际上还是错的,因为以前出过这么个BUG。但是在1.4版本之后main方法已经被强制成了public,所以现在我们看到的main方法只能是public
      main方法之所以是public,是因为一个Java程序在运行时首先创建一个JVM实例,程序要运行需要调用main方法,JVM从外部调用main方法这就需要访问权限修饰符必须给出外部访问的权限,所以只能用public
      java虚拟机通过main方法找到需要启动的运行程序,并且检查main函数所在类是否被java虚拟机装载。如果没有装载,那么就装载该类,并且装载所有相关的其他类。因此程序在运行的时候,第一个执行的方法就是main()方法。通常情况下,如果要运行一个类的方法,必须首先实例化出来这个类的一个对象,然后通过对象名.方法名()的方式来运行方法,但是因为main是程序的入口,这时候还没有实例化对象,因此将main方法声明为static的,这样这个方法就可以直接通过类名.方法名()的方式来调用。
      void表示main方法没有返回值,没有返回值的原因是因为Java不需要main方法向操作系统返回退出信息。如果main方法正常退出,那么Java应用层序的退出代码为0,表示成功的运行了程序

      main的名称不能变是为了JVM能够识别程序运行的起点,main方法可以被重载,重载的main方法不会被执行。main方法作为程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程,非守护线程和守护线程,main方法属于非守护线程,守护线程通常由JVM自己使用,Java程序也可以表明自己的线程是守护线程。当程序中所有的非守护线程终止时,JVM退出。也可以用Runtime类或者System.exit()来退出。

      String[] args,是main方法中唯一可以改变的地方!args是arguments的缩写,只是一个变量默认名,习惯性写作它,但是也可以改变的,只要符合命名规则随便你写成什么。在使用集成开发工具的今天,String[] args更像是一种摆设了,很多初学者都不知道它的作用,其实它是程序运行传入的一个参数组。一个简单的例子:

1
2
3
4
5
6
7
8
public class Test{
public static void main(String[] args){
System.out.println("获取数组args[]的数据");
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
}
}

      以管理员身份运行CMD,因为我的Test.java是直接保存在F盘中的,输入f:跳转到目录,输入Javac Test.java将其编译为Test.class文件,然后再输入java Test 1 2 3,可以发现打印输出1 2 3。

以上讲解了main方法,但是为什么现在的web项目里没有main方法呢?

抄自:
https://blog.csdn.net/lyt_7cs1dn9/article/details/52469472
https://ask.csdn.net/questions/369015
https://www.cnblogs.com/dhl-2013/articles/3272516.html

      首先理解一下main方法:你的java程序要运行,总要有一个起点,所以我们就约定,从main方法这里开始一行一行执行,java程序跑起来,一般是通过主类的main方法启动的。
      其次,web项目是由容器启动的。也就是服务器,tomcat之类。

tomcat的主类是BootStrap类,这个类里面有一个main方法,以此类的main方法作为入口启动,同时这里它主要加载tomcat自己的配置和web.xml里面配置的内容。web项目部署到tomcat服务器之后,启动tomcat,tomcat从它自己的主函数开始运行,就一直在跑着,等到请求过来的时候。tomcat接受到请求,它直接从项目文件中把那个没有主函数的应用拉进来,就这么直截了当的执行了其中的方法。
相当于只有一个main方法,其他的都是等请求过来的时候,根据请求调用相应的方法

Newer Post

java中比较String是否相同为何用equals而不是==?

参考自:https://www.cnblogs.com/baotong-9396/p/7182906.htmlhttp://www.cnblogs.com/panxuejun/p/5866869.html 如题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为一个写惯了js …

继续阅读
Older Post

JAVA环境变量JAVA_HOME、CLASSPATH、PATH配置说明以及javac命令无法使用的问题

抄自:https://blog.csdn.net/luckykapok918/article/details/37053949基础概念 current directory(当前目录):当前在用的目录就是当前目录&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比如说当你打开NO …

继续阅读