详细讲解Java中的main()方法

 更新时间:2016年09月05日 09:11:56   投稿:daisy  
在java中main()方法是java应用程序的入口方法,由此可见main方法是很重要的,那么下面这篇文章就给大家详解介绍了Java中的main()方法,需要的朋友可以参考下。

前言

JAVA中的主函数是我们再熟悉不过的了,相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数,但对于主函数为什么这么写,其中的每个关键字分别是什么意思,可能就不是所有人都能轻松地答出来的了。我也是在学习中碰到了这个问题,通过在网上搜索资料,并加上自己的实践终于有了一点心得,不敢保留,写出来与大家分享。

Java中的main()方法

java虚拟机通过main方法找到需要启动的运行程序,并且检查main函数所在类是否被java虚拟机装载。如果没有装载,那么就装载该类,并且装载所有相关的其他类。因此程序在运行的时候,第一个执行的方法就是main()方法。通常情况下, 如果要运行一个类的方法,必须首先实例化出来这个类的一个对象,然后通过"对象名.方法名() "的方式来运行方法,但是因为main是程序的入口,这时候还没有实例化对象,因此将main方法声明为static的,这样这个方法就可以直接通过“类名.方法名() ”的方式来调用。

在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下:

/** 
* Java中的main()方法详解 
*/ 
public class HelloWorld { 
 public static void main(String args[]) { 
 System.out.println("Hello World!"); 
 } 
}

一、先说类: 

HelloWorld 类中有main()方法,说明这是个java应用程序,通过JVM直接启动运行的程序。
既然是类,java允许类不加public关键字约束,当然类的定义只能限制为public或者无限制关键字(默认的)。

二、再说main()方法

这个main()方法的声明为:public static void main(String args[]) 。必须这么定义,这是Java的规范。

为什么要这么定义,和JVM的运行有关系。

当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。

由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为public static。

对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。

main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个入参,类细必须String[] ,至于字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和sun java规范范例中mian参数名保持一致,取名为args。

因此,main()方法定义必须是:“public static void main(String 字符串数组参数名[]) ”。

三、main()方法中可以throw Exception

因此main()方法中可以抛出异常,main()方法上也可以声明抛出异常。

比如,下面这个写法是正确的:

public class TestMain { 
 public static void main(String[] args) throws Exception { 
  System.out.println("哈哈哈哈哈"); 
  throw new Exception(""); 
 } 
}
运行结果:
哈哈哈哈哈 
Exception in thread "main" java.lang.Exception: 
 at maintest.TestMain.main(TestMain.java:11) 
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
 at java.lang.reflect.Method.invoke(Method.java:585) 
 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90) 

Process finished with exit code 1

四、main()方法中字符串参数数组作用

main()方法中字符串参数数组作用是接收命令行输入参数的,命令行的参数之间用空格隔开。

下面给出一个例子,看看如何初始化和使用这个数组的。

/**
* 打印main方法中的输入参数 
*/ 
public class TestMain { 
 public static void main(String args[]){ 
 System.out.println("打印main方法中的输入参数!"); 
 for(int i=0;i<args.length;i++){ 
  System.out.println(args[i]); 
 } 
 } 
}

执行方法和运行结果

D:\Study\basetest\src>javac TestMain.java 

D:\Study\basetest\src>java TestMain 1 2 3 
打印main方法中的输入参数! 
1 
2 
3 

五、给出HelloWorld的另外一个版本

/** 
* 变态版的HelloWorld.呵呵 
*/ 
public class HelloWorld2 { 
 static { 
 System.out.println("Hello Wordld!"); 
 } 
 public static void main(String args[]){ 
 System.exit(0); 
 } 
}

这个main()方法执行的内容就一句" System.exit(0); " ,目的是让程序正常结束。那“HelloWorld!”是从哪里打印的,秘密就是在static打印的,因为static代码块的内容会在main调用前调用。

六、实例

虚拟机通过调用某个指定类的方法main启动,传递给main一个字符串数组参数,使指定的类被装载,同时链接该类所使用的其它的类型,并且初始化它们。例如对于程序:

public class HelloApp {
 public static void main(String[] args) {
 System.out.println("Hello World!");
 for (int i = 0; i < args.length; i++) {
  System.out.println(args);
 }
 }
}

编译后在命令行模式下键入: java HelloApp run virtual machine

将通过调用HelloApp的方法main来启动java虚拟机,传递给main一个包含三个字符串"run"、"virtual"、"machine"的数组。现在我们略述虚拟机在执行HelloApp时可能采取的步骤。

开始试图执行类HelloApp的main方法,发现该类并没有被装载,也就是说虚拟机当前不包含该类的二进制代表,于是虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个进程失败,则抛出一个异常。类被装载后同时在main方法被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段:检验,准备和解析。检验检查被装载的主类的符号和语义,准备则创建类或接口的静态域以及把这些域初始化为标准的默认值,解析负责检查主类对其它类或接口的符号引用,在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。

整个过程如下:

总结

main方法作为一个特殊的规范,与普通的方法有很大区别,限制很多,理解其原理需要学习JVM相关知识。是Java中学习中大障碍。以上就是小编为大家整理的对main原理和使用的总结,希望对大家能有所帮助,如果有疑问大家可以留言交流。

相关文章

  • Java基础之Math和Random类知识总结

    Java基础之Math和Random类知识总结

    今天带大家来学习java的Math和Random类,文中有非常详细的代码示例及介绍,对正在学习java基础的小伙伴们很有帮助哟,需要的朋友可以参考下
    2021-05-05
  • 解决Mybatis返回update后影响的行数问题

    解决Mybatis返回update后影响的行数问题

    这篇文章主要介绍了解决Mybatis返回update后影响的行数问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • SpringMVC4.3 HandlerExceptionResolver异常处理源码解析

    SpringMVC4.3 HandlerExceptionResolver异常处理源码解析

    这篇文章主要为大家介绍了SpringMVC4.3 HandlerExceptionResolver异常处理源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-09-09
  • springboot线程池监控的简单实现

    springboot线程池监控的简单实现

    本文主要介绍了springboot线程池监控的简单实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java Web基于Session的登录实现方法

    Java Web基于Session的登录实现方法

    这篇文章主要介绍了Java Web基于Session的登录实现方法,涉及Java针对session的操作及表单提交与验证技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • springboot2.x解决运行顺序及Bean对象注入顺序的问题

    springboot2.x解决运行顺序及Bean对象注入顺序的问题

    这篇文章主要介绍了springboot2.x解决运行顺序及Bean对象注入顺序的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 教你一步解决java.io.FileNotFoundException:找不到文件异常

    教你一步解决java.io.FileNotFoundException:找不到文件异常

    这篇文章主要给大家介绍了关于如何一步解决java.io.FileNotFoundException:找不到文件异常的相关资料,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Spring之ShutDown Hook死锁现象解读

    Spring之ShutDown Hook死锁现象解读

    这篇文章主要介绍了Spring之ShutDown Hook死锁现象解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java Servlet简单实例分享(文件上传下载demo)

    Java Servlet简单实例分享(文件上传下载demo)

    下面小编就为大家带来一篇Java Servlet简单实例分享(文件上传下载demo)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot整合XxlJob分布式任务调度平台

    SpringBoot整合XxlJob分布式任务调度平台

    xxl-job是一个开源的分布式定时任务框架,它可以与其他微服务组件一起构成微服务集群。它的调度中心(xxl-job)和执行器(自己的springboot项目中有@XxlJob("定时任务名称")的方法)是相互分离,分开部署的,两者通过HTTP协议进行通信
    2023-02-02

最新评论