Main方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么main方法是public、static、void的。当然,很多人首先学的是C和C++,但是在Java中main方法与前者有些细微的不同,它不会返回任何值。

Main方法是Java程序的入口,也可以理解为一个接口,记住,我们这里不会讨论Servlet、MIDlet和其他任何容器管理的java程序,在java核心编程中,JVM会查找类中的public static void main(String[] args),如果找不到该方法就抛出错误NoSuchMethodError:main 程序终止。
Main方法必须严格遵循它的语法规则,方法签名必须是public static void,参数是字符串数组类型,如果是Java1.5及以后的版本还可以使用可变参数:

public  static void main(String... args)

为什么main方法是静态的(static)

  1. 正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。
  2. 因为C和C++同样有类似的main方法作为程序执行的入口。
  3. 如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。
  4. 静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。

为什么main方法是公有的(public)

Java指定了一些可访问的修饰符如:private、protected、public,任何方法或变量都可以声明为public,Java可以从该类之外的地方访问。因为main方法是公共的,JVM就可以轻松的访问执行它。

为什么main方法没有返回值(Void) 

     因为main返回任何值对程序都没任何意义,所以设计成void,意味着main不会有任何值返回

总结   

  1. main方法必须声明为public、static、void,否则JVM没法运行程序
  2. 如果JVM找不到main方法就抛出NoSuchMethodError:main异常,例如:如果你运行命令:java HelloWrold,JVM就会在HelloWorld.class文件中搜索public static void main (String[] args) 放法
  3. main方式是程序的入口,程序执行的开始处。
  4. main方法被一个特定的线程”main”运行,程序会一直运行直到main线程结束或者non-daemon线程终止。
  5. 当你看到“Exception in Thread main”如:Excpetion in Thread main:Java.lang.NullPointedException ,意味着异常来自于main线程
  6. 你可以声明main方法使用java1.5的可变参数的方式如:
    public  static void main(String... args)
  7. 除了static、void、和public,你可以使用synchronized、和strictfp修饰符在main方法的签名中,如:
    public  static final  synchronized static  void main(String[] args)
  8. main方法在Java可以像其他方法一样被重载,但是JVM只会调用上面这种签名规范的main方法。
  9. 你可以使用throws子句在方法签名中,可以抛出任何checked和unchecked异常
  10. 静态初始化块在JVM调用main方法前被执行,它们在类被JVM加载到内存的时候就被执行了。
  11. 需要注意的是在static修饰的方法体内不能直接使用非static修饰的成员变量和成员方法。
public class Test {public static void main(String[] args) {     //正确的int a = 50;int b = a + 50;int c = b+1;System.out.println("b ="+b+", c ="+c);}
}
public class Test1 {public void main(String[] args) {     //错误的int a = 50;int b = a + 50;int c = b + 1;System.out.println("b =" + b + ", c =" + c);}
}错误: main 方法不是类 test.Test1 中的static, 请将 main 方法定义为:public static void main(String[] args)

static方法属于某个类而不属于某个对象,所以在static方法中是可以直接通过类名调用的而不必创建出实例。 而在C/C++中,其main方法并不是属于某个类的,它是一个全局的方法,所以当我们运行的时候,C/C++编译其能够很容易的就找到main方法并执行;但是运行程序的时候,因为java都是以类组织在一起的,当我们运行某个程序的时候,我们并不知道这个main方法放在那个类中,也不知道是否要产生一个类的对象,所以,为了解决这个问题我们将main方法定义为static的,当这样的话当我们在执行一个java代码的时候,例如上图中用命令提示符java Test,编译器就会在Test类中去寻找静态的main方法,而不产生Test类的对象,当JVM加载Test类的时候main方法自然也就被加载了而用来作为程序的入口。

关于java中main方法为什么必须是静态的相关推荐

  1. java中main方法前的public static void及其后面的(String[] args)【笔记自用】

    为什么Java的main方法必须是public static void? 一. void 如下,像C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错. 找到一种可理 ...

  2. Java中main方法的6种声明形式

    前记:今天刷牛客,遇到了这道题目,平时只见到第一种,没想到居然可以有多种形式.在此记下,谨记共勉. Java中main方法的6种声明形式: 第一种,最常规形式 public static void m ...

  3. java中main方法返回类型是6_[单选] Java application中的主类需包含main方法,main方法的返回类型是什么()。...

    [单选] Java application中的主类需包含main方法,main方法的返回类型是什么(). 更多相关问题 关于超声在人体中传播的速度,叙述正确的有A.与人体组织的弹性有关B.与人体组织的 ...

  4. java中main方法的作用是什么_java中main方法是什么

    Java中的main方法,是一个java应用程序的入口,无论一个java的应用多么复杂庞大,或是多么的小,只要他是一个可以运行的java程序那么必然就要有一个main方法. main方法的定义格式通常 ...

  5. c++ main函数调用 类中的枚举_为什么 Java 的 main 方法必须是 public static void?

    点击上方 Java进阶之道,选择 设为星标 优质文章,及时送达 为什么 main 方法是静态的(static)? 为什么main方法是公有的(public) ? 为什么 main 方法没有返回值(Vo ...

  6. 今天终于搞懂了:为什么 Java 的 main 方法必须是 public static void?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:suo.im/6v9d64 为什么 main 方法是 ...

  7. 你知道为什么Java的main方法必须是public static void?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://suo.im/6v9d64 Main 方法是我 ...

  8. main方法_你知道为什么Java的main方法必须是public static void?

    来源:http://suo.im/6v9d64 Main 方法是我们学习 Java 编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public.static.void 的.当然, ...

  9. 为什么Java的main方法必须是public static void?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://suo.im/6v9d64 Ma ...

最新文章

  1. 智慧城市建设的关键技术研究
  2. Java线程池Executor框架
  3. python图形化界面开发工具_图形用户界面(GUI)常见问题
  4. php psr4 控制器调用模型,控制器中调用模型添加数据
  5. 一些比较少用但比较有用的linux命令备忘
  6. Kubernetes 1.9集群使用traefik发布服务
  7. laravel 中间件中返回视图
  8. python网络编程系列
  9. 干不过微信,又抢钉钉地盘!中移动砸下 8400 万重做飞信
  10. Spring 单元测试(Junit)
  11. pathseparator_Java文件分隔符,separatorChar,pathSeparator,pathSeparatorChar
  12. 把arduino当AVRISP烧写器Arduino给Arduino烧boot
  13. STM32---FLASH闪存
  14. CodecContext-gop_size 是什么
  15. Python 数据处理与分析(五) 设计一个高回报的投资组合(投资回报和风险分析)任务 4:马科维茨的均值-方差组合模型
  16. php转html为pdf后部分图片无法显示
  17. (5/8 软件漏洞攻击利用技术)如何成为一名黑客(网络安全从业者)——网络攻击技术篇
  18. openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决
  19. 野路子玩Android(二)使用log打印信息
  20. linux进程的查看和查找 ps命令解析

热门文章

  1. mybatis使用char类型字段查询oracle数据库时结果查询不到的问题
  2. spring cloud简介之最好参考
  3. mysql 命令 字符集_MySQL的字符集操作命令总结
  4. 【开发随笔】以强化学习环境 gym 库为例:为什么日常中我应该试图标准化接口?
  5. mysql单库tps_简单计算mysql 的QPS,TPS
  6. WiresShark 图解教程1
  7. 打包vue项目时报错:Expected indentation of 6 spaces but found 10
  8. php开发_图片验证码
  9. String通过“+”号拼接字符串的底层实现
  10. linux 动态内存分配,具体来说,fork()如何处理Linux中malloc()动态分配的内存?