为什么 main 方法是 public static void ?

为什么 main 方法是 public static void ?初级程序员面试经常会遇到这个问题,这篇博客带你排异解难。

大家好,又见面了,我是你们的朋友全栈君。

写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的

这博客是对自己学习的一点点总结及记录,如果您对 Java算法 感兴趣,可以关注我的动态,我们一起学习。

用知识改变命运,让我们的家人过上更好的生活


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

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)

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

  • 正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。

  • 因为C和C++同样有类似的main方法作为程序执行的入口。

  • 如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。

  • 静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。

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

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

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

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

4、总结

  • main方法必须声明为public、static、void,否则JVM没法运行程序

  • 如果JVM找不到main方法就抛出NoSuchMethodError:main异常,例如:如果你运行命令:java HelloWrold,JVM就会在HelloWorld.class文件中搜索public static void main (String[] args) 方法。

  • main方法是程序的入口,程序执行的开始处。

  • main方法被一个特定的线程”main”运行,程序会一直运行直到main线程结束或者non-daemon线程终止。

  • 当你看到“Exception in Thread main”如:Excpetion in Thread main:Java.lang.NullPointedException ,意味着异常来自于main线程。

  • 你可以声明main方法使用java1.5的可变参数的方式如:
    public static void main(String... args)

  • 除了static、void、和public,你可以使用finalsynchronized、和strictfp修饰符在main方法的签名中,如:
    public strictfp final synchronized static void main(String[] args)

  • main方法在Java可以像其他方法一样被重载,但是JVM只会调用上面这种签名规范的main方法。

  • 你可以使用throws子句在方法签名中,可以抛出任何checked和unchecked异常。

  • 静态初始化块在JVM调用main方法前被执行,它们在类被JVM加载到内存的时候就被执行了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138361.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PHP 常用的header头部定义汇总

    PHP 常用的header头部定义汇总

    2021年9月20日
    40
  • MFC线程同步—— CCriticalSection类使用

    MFC线程同步—— CCriticalSection类使用多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。CCriticalSection类的用法:方法一:(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

    2022年7月20日
    12
  • CRC校验算法详解及代码实现[通俗易懂]

    CRC校验算法详解及代码实现一、 CRC校验算法前置知识在学习CRC校验算法之前,先复习一下CRC会涉及的主要几个主要的算法。异或异或,就是不同为1,相同为0,运算符号是^。0^0=00^1=11^1=01^0=1异或运算存在如下几个规律,需要了解。0^x=x 即0异或任何数等于任何数1^x=~x 即1异或任何数等于任何数取反…

    2022年4月18日
    132
  • Spring源码阅读指南_redis编译安装

    Spring源码阅读指南_redis编译安装1.前言:经过多次拉取Spring源码编译失败经历,一下抓取配置编译过程各个软件版本可能有影响因此先做以记录(时间不同也会导致版本出入要注意)Idea:2020.1.1(参考文献博主2019.3.3版本也可)插件:maven(3.6.3)(未用到)Gradle(4.10.3)Kotlin(idea内装)JDK:原机安装1.8版本需要11版本(后续会说明JDK1.8问题)注:流程可能较长,源码拉取编译不易,耐心阅读2.流程2.1抓取Spring源码GITHUB网址:https://gi

    2022年8月12日
    10
  • matlab安装包

    matlab安装包1.导入路径——保存2.compile——windows

    2022年6月11日
    27
  • 方差、协方差、标准差、均方差、均方根值、均方误差、均方根误差对比分析[通俗易懂]

    方差、协方差、标准差、均方差、均方根值、均方误差、均方根误差对比分析[通俗易懂]方差、协方差、标准差(标准偏差/均方差)、均方误差、均方根误差(标准误差)、均方根值本文由博主经过查阅网上资料整理总结后编写,如存在错误或不恰当之处请留言以便更正,内容仅供大家参考学习。 方差(Variance) 方差用于衡量随机变量或一组数据的离散程度,方差在在统计描述和概率分布中有不同的定义和计算公式。①概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏…

    2022年9月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号