在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,例如

  • 方法的名字必须是main
  • 方法必须是public static void 类型的
  • 方法必须接收一个字符串数组的参数。

案例

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

HelloWorld 类中有main()方法,说明这是个java应用程序,通过JVM直接启动运行的程序。

问题1、main()方法为何被声明为public static?

这和JVM的运行有关系,当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用,因此需要是限制为public static。

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

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

public class NewTest {public static void main(String args[]){for(int i = 0;i < args.length; i++){System.out.println("prinit:" +args[i]);}}
}

在idea运行main方法,会发现打印参数为空,原因是idea中启动这个类默认传空参

javac NewTest.java
java NewTest 1,2,3

结果

main()方法中可以throw Exception

public class TestMain {  public static void main(String\[\] args) throws Exception {  System.out.println("111");  throw new Exception("");  }
}

@Test单测方法和main方法区别
单测方法结束的时候会把里面的资源释放了,导致里面线程提前结束。main方法结束后其它的线程资源还能继续运行,案例如下,这是一个模拟ConcurrentModificationException异常的案例

main方法中会产生预期的报错

    public static void main(String[] args) {Map<String,String> list = new HashMap<>();for (int i = 0; i < 30; i++) {new Thread(()->{list.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));System.out.println(list);},"t"+i).start();System.out.println(i);}}

test方法中不会出现预期报错

@Testpublic void test() throws InterruptedException {Map<String,String> list = new HashMap<>();for (int i = 0; i < 30; i++) {new Thread(()->{list.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));System.out.println(list);},"t"+i).start();}}

test方法中对应test线程,因为for循环中每次循环都会创建一个新线程并立刻启动了该线程,test线程进行for循环30次是个瞬时操作(1ms以内完成),而线程的创建+启动个人主机需要几百毫秒,没等线程的创建+启动,test线程就执行完了,而其余30个线程只能是释放资源然后方法结束;

所以,我们让test线程睡1000ms,给其它线程创建和运行的时间,这样就能复现这个exception了

 @Testpublic void test() throws InterruptedException {Map<String,String> list = new HashMap<>();for (int i = 0; i < 30; i++) {new Thread(()->{list.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));System.out.println(list);},"t"+i).start();System.out.println(111);}Thread.sleep(1000);}

结论:多线程测试不要在test测试方法中进行,需要在main中进行

深入理解Java main方法相关推荐

  1. main方法中args_public static void main(String [] args)– Java main方法

    main方法中args public static void main(String[] args) is the most important Java method. When you start ...

  2. java main 方法使用 HttpClients发送请求 不打印debug日志

    记录目的:java main 方法使用HttpClients发送请求不打印debug日志 记录背景: 使用java main方法测试接口响应时间 发现问题: 控制台打印巨多debug日志 解决方法: ...

  3. Java main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  4. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  5. Maven exec:java 运行 Java main 方法

    目录 前言 适用条件 方法1 遇到错误:[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.5.0:java (d ...

  6. 两种参数类型_深入理解Java中方法的参数传递机制

    形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...

  7. java main方法里调用mapper

    在main方法中调用mybatis的mapper,一次性执行导入数据功能package com.runxsoft.test;import com.runxsoft.iutils.common.util ...

  8. java main方法背后的故事?(转)

    jvm java 看似一种语言,实则一个巨大的体系的王国,开发这么多年了,还是没有搞懂,我以为我懂了,可是过了一段时间又忘了,所以说还是没懂 1.main方法说起 编译完我们的java文件后,需要有个 ...

  9. Java main()方法

    在 Java 中,main() 方法是 Java 应用程序的入口方法,程序在运行的时候,第一个执行的方法就是 main() 方法.main() 方法和其他的方法有很大的不同. 下面先来看最简单的一个 ...

最新文章

  1. 四字节对齐(DWORD-aligned)
  2. Flutter入门:application、module、package、plugin
  3. 迁移到 Centos 7 遇到的一些常见问题
  4. 北大助理教授献给「后浪」的建议:奔涌吧,深度学习!
  5. 基于SSM的理财系统
  6. paip.提升安全性---防止敏感文件被下载
  7. HBase: 看上去很美
  8. 保活 进程唤醒_Android 8.0以上系统应用如何保活
  9. linux系统手柄模拟器下载,MotioninJoy
  10. 适用于dev中c语言的图形库,Dev-C++中使用EGE图形库
  11. 深度学习面试100题
  12. android5.0 输入法提取,搜狗手机输入法5.0 Android新版使用体验
  13. 511遇见易语言文本处理寻找文本
  14. Fater-RCNN
  15. python中key=lambda_排序后的语法(key=lambda:…)
  16. 手机上将png转pdf_如何在Linux上将多个jpg图像合并为pdf?
  17. NOI:253 丛林里的路
  18. 计算机视觉实习生面试经验(微软/腾讯(AI Lab优图)/阿里巴巴)
  19. Windows10 锁屏界面黑屏,无法显示图片——解决方法
  20. LSP(Layered Service Provider)入门的基础知识概念

热门文章

  1. 贪心法解部分背包问题
  2. flash 与数据库 图解
  3. AI杂谈(2)请教支持向量机用于图像分类
  4. vue中使用FullCalendar日历组件
  5. Vue (响应式原理-模拟-2-Observer)
  6. YooQ与《Charlotte》
  7. php向前截取字符串函数,ThinkPHP 模板substr的截取字符串函数详解
  8. VMware关闭虚拟机系统后不见了
  9. java 程序打包成jar_Java程序打包成jar包
  10. python大数据_python大数据