一、 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关键字

  2、public关键字改为protected

  3、public改为private

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

  public是函数的权限,决定了是否可以被外部函数调用,如果改为private,则只能是该main函数所在类的方法可以调用,在其他类中不可见,protected规定子类和同一个包类可用,但是调用main函数的函数所在包和main函数所在包肯定不在同一个包内,所以必须是public。C里面的函数是运行在操作系统环境中的,注意是运行时库调用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函数也可以重载,只要满足重载的条件即可。

为什么Java的main方法必须是public static void?的更多相关文章

  1. 错误 在类中找不到main方法请将main方法定义为 public static void main String args否则JavaFX应用程序类必须扩展javafx-ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

  2. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

  3. 找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.应用程序类必 须扩展javafx.application.Application”

    用eclipse写代码的时候,写了一个简单的程序,编译的时候突然出现“错误: 在类 com.test.demo 中找不到 main 方法, 请将 main 方法定义为: public static v ...

  4. 错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application

    错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)否则 JavaFX 应用程序类必须扩展ja ...

  5. eclipse 运行错误:在类XXX中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application

    新建了一个类Hello: 代码: 第一次运行报错: 点击关闭该类的界面时出现: 点击是,然后再次打开,可以正确执行,结果为: 这是为什么....,后来发现了原因:是每次运行或调试前没有自动保存编辑的内 ...

  6. 找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)

    https://blog.csdn.net/liu1340308350/article/details/80746671

  7. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:    public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application 。

    昨天在eclipse编写JAVA程序时,遇到一个问题: 错误: 在类中找不到 main 方法, 请将 main 方法定义为:    public static void main(String[] a ...

  8. 《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法

    public staticvoid main(String[] args)为Java程序的入口方法,JVM在运行程序的时候,会首先查找main方法.其中,public是权限修饰符,表明任何类或对象都可 ...

  9. 在java中为什么要把main方法定义为一个static方法?

    我们知道,在C/C++当中,这个main方法并不是属于某一个类的,它是一个全局的方法,所以当我们执行的时候,c++编译器很容易的就能找到这个main方法,然而当我们执行一个java程序的时候,因为ja ...

随机推荐

  1. CCF CSP 201604-1 折点计数

    题目链接:http://118.190.20.162/view.page?gpid=T42 问题描述 试题编号: 201604-1 试题名称: 折点计数 时间限制: 1.0s 内存限制: 256.0M ...

  2. SQLSERVER 查询系统中的所有表的数量

    SELECT a.name, b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = ...

  3. 下拉框click事件与搜索框blur事件的爱恨纠葛

    还原车祸现场 功能类似于百度搜索,搜索框输入内容,下拉框显示候选项,点击候选项就选择候选项,然后下拉框隐藏,点击外面就直接隐藏下拉框,于是我写了以下代码 //参会单位联想 $('input[name= ...

  4. 【题解】Luogu P2347 砝码称重

    正经·DP题解 一道非常好的背包练手题( sto(注:原思路来源 SLYZ_0120 的题解)orz 开始这道题 1.输入六个数,存进数组中 2.初始化 f 数组为0. f [ i ] 表示重量为 i ...

  5. 基础JAVA程序设计(多个类与方法的实现2)

    设计一个类代表二维空间的一个点(Point),要求:两个成员变量:x坐标和y坐标. 设计一个类代表二维空间的一个圆(Circle),要求:两个成员变量:一个是圆心,一个是半径:提供计算圆面积的方法:提 ...

  6. Java链接MySQL数据库的用配置文件和不用配置文件的代码

    1.利用配置文件(db.properties)链接MySQL数据库 package tool; import java.io.FileInputStream;import java.sql.Conne ...

  7. GreenDao教程2

    总述: 所有的增删改查都需要通过greendao通过实体对象类生成的Dao来实现, 具体实现如下图 1.初始化数据库操作对象(GreenDao自动生成的操作对象) 2.通过数据库操作对象,进行增删改查 ...

  8. js去除数组里重复的条目,返回被删除的条目的新数组

    我爱撸码,撸码使我感到快乐! 大家好,我是Counter. 今天给大家分享的是利用js进行数组的去重,还是老样子,该注释的都注释在代码里了 欢迎一起技术探讨,一起成长. 效果如下: 代码给出: // ...

  9. SQL实践遇到的知识点

    聚集函数count() count()统计元组的个数,即行数 count(0).count(1)与count(*)的执行效率是一样的 count(column)与count(*) 如果column中含 ...

  10. CentOS7安装GUI图形界面

    本文转自centOS7下安装GUI图形界面,侵权删. 1. 在命令行下 输入下面的命令来安装Gnome包. # yum groupinstall "GNOME Desktop" & ...