zoukankan      html  css  js  c++  java
  • 为什么Java的main方法必须是public static void?

    一、 void

      如下,C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错。

     

      找到一种可理解的解释:方法的副作用和返回值类型。(http://www.cnblogs.com/huanmin/p/6429778.html)

      一个方法的执行,如果在返回一个值之外还导致某些外部“状态”发生变化,则称该方法产生了副作用。这里所谓“状态”发生变化,可以是实例域或静态变量被修改。

    1. 没有返回值的方法必有副作用,除非它的方法体是空的或者方法没有意义。所以,没有返回值的方法、有返回值但有副作用的方法称为过程;
    2. 有返回值而且没有副作用的方法称为函数(function)。

      由于Java的主函数是栈中最底层的函数,所以并不存在能够接收的值(没有谁能接收main的返回值),所以使用void

    可是为什么Java不能像C, C++那样返回int型值?

      找到描述C语言main函数的调用过程:首先,我们的程序进入到入口函数之前,是发生了很多事情的。操作系统的安排,启动运行时库,运行时库再初始化好环境,然后启动你的入口函数,你的程序才正常的运行起来。等你的程序运行结束后,就退回到运行时库,然后再退回到操作系统,然后系统再调度其他程序执行。(https://www.cnblogs.com/deanyuton/p/8227733.html)

      因为main()不是由操作系统直接调用,所以返回类型不一样也是可以理解的。可以认为运行时库就是操作系统和main函数的中间联系人,在C语言中由运行时库直接调用main函数,所以main函数的返回值也是运行时库接收。Java中,可以认为是操作系统→JVM→main函数这样的调用过程,JVM直接调用main函数,所以如果main函数有返回值,即JVM接收。但是JVM被设计为不接受任何返回值,所以main函数不能有返回值,只能void。

    但是JVM为什么不接受返回值?

    https://www.cnblogs.com/mengfanrong/p/5225506.html(装载JVM)

    https://www.cnblogs.com/iceAeterNa/p/4876940.html (深入虚拟机)

    二、 public

      1、去掉public关键字

     

      2public关键字改为protected

     

      3、public改为private

     

      编译警告The method main(String[]) from the type TestMain is never used locally

      public是函数的权限,决定了是否可以被外部函数调用,如果改为private,则只能是该main函数所在类的方法可以调用,在其他类中不可见protected规定子类和同一个包类可用,但是调用main函数的函数所在包和main函数所在包肯定不在同一个包内,所以必须是publicC里面的函数是运行在操作系统环境中的,注意是运行时库调用main函数,但是整个C代码及运行时库都直接在操作系统中运行,但是Java的代码是运行在JVM中的,如果不限定public,JVM就无法调用main函数。(https://blog.csdn.net/echostream/article/details/44039169

      但是Java SE1.4以前是不强制main函数为public的。main方法不是public时,有些版本的java解释器也可以执行java应用程序。有个程序员报告了这个bug. 如果感兴趣可以查一下这个bug号码4252539.这个bug被标明“关闭”,不予修复。Sun公司的工程师解释说:java虚拟规范并没有要求main方法一定是public。 好在,这个问题在 java SE1.4及以后的版本中强制main方法是public 最终的到了解决。(https://www.cnblogs.com/liutaoblogs/p/6542628.html

    三、 static

     

      在C语言中,所有的函数都可以被直接调用,main函数相当于全局函数,但在Java中一般先要创建一个类的对象,再通过对象调用函数,但是在执行main函数之前创建一个对象显然是不可能的,因为JVM规定main函数为入口函数,从main开始执行static关键字就解决了这个问题,static关键字修饰的方法可以视为类方法,不需要创建对象就可以直接调用该方法。

    四、 main方法重载

      main函数也可以重载,只要满足重载的条件即可。

     

  • 相关阅读:
    ABAP-年月期间搜索帮助
    Others-Goldengate 数据同步
    ABAP-语音输出
    ABAP-ALV报表导出格式恢复初始画面
    ABAP-动态创建DATABASE/FUNCTION(风险)
    JDK 12 安装
    级数判敛--转自高教
    一文搞懂 JavaScript 中 DOM 相关的距离
    你应该知道的前端编程利器 VS Code
    js变量提升与函数提升的详细过程
  • 原文地址:https://www.cnblogs.com/datamining-bio/p/9873722.html
Copyright © 2011-2022 走看看