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

一、 void

如下,像C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错。
  
找到一种可理解的解释:方法的副作用和返回值类型。(http://www.cnblogs.com/huanmin/p/6429778.html)

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

没有返回值的方法必有副作用,除非它的方法体是空的或者方法没有意义。所以,没有返回值的方法、有返回值但有副作用的方法称为过程;
有返回值而且没有副作用的方法称为函数(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
 
 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方法参数String[ ] args的使用。

我们刚开始学习java时都会被要求记住主方法(main)的写法,就像这样:

1 public static void main(String[] args){ }
2 public static void main(String args[]){ }   //两种写法都是一样的,都表示字符串数组args,其中args只是普通变量名,可以随意定义(前提是符合变量名规则)

为什么一定要这么写?是java规定的(具体的意义我不知道),main方法参数必须为字符串数组(String [ ]),变量名可以随意,通常使用args即是arguments(”参数“的复数形式)的缩写。
如果我们就是不呢?那就不能被系统识别为主方法,例如这样:

1  public static void main(String args){ //将String[]改成了String
2         //省略几百万代码
3 }

在Eclipse运行结果:

如果在已经有正确main方法,再有同名的main方法就是方法重载了:

1 public static void main(String[] args){2     //正确标准完美的main方法
3 }
4
5 public static void main(String args){6     //方法重载
7 }

回归正题:

== 参数String[ ] args的作用就是可以在main方法运行前将参数传入main方法中。==

1)从控制台,输入编译执行命令时传参数。例如下面代码:

1 public static void main(String[] args){2     for(int i=0; i<args.length; i++)
3         System.out.println(args[i]);        //遍历输出args[]中元素
4 }

但是此时args[]并没有赋值,我们需要从控制台命令行进行赋值,就像这样:

所以在命令行中使用String[ ] args即传入参数的使用为:java 类名 【参数1】 【参数2】 【参数3】 .。。。

2)在Eclipse使用String[ ] args。

    鼠标右键点击程序


出现以下窗口,切换到(x)=Arguments窗口,输入参数

最后点击Run运行即可。

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

  1. 有初学的同学问你为什么Java的main方法必须是public static void?请告诉ta!

    相信这个问题你也思考过?但是如果让你说起来,你知道怎么叙述吗?或者说怎么说明白. 问题:为什么Java的main方法必须是public static void? 科班出身的话,相信大家都是先学习的C ...

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

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

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

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

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

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

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

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

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

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

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

    Main 方法是我们学习 Java 编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public.static.void 的.当然,很多人首先学的是 C 和 C++,但是在 Jav ...

  8. 【Java】错误: 在类 Test1.Test2 中找不到 main 方法, 请将 main 方法定义为:    public static void main(String[] args)的解决方案

    问题:运行Java程序的时候碰到如下问题 错误: 在类 Test1.Test2 中找不到 main 方法, 请将 main 方法定义为:    public static void main(Stri ...

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

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

最新文章

  1. 在Windows环境下搭建Android开发环境
  2. python编程下载安卓版-python编程入门
  3. tomcat(2)--集群
  4. 安全测试-抓包工具BurpSuite
  5. 启明云端分享|PX30核心板 怎么烧录
  6. OpenCV探索之路(三):滤波操作
  7. LeetCode 241. 为运算表达式设计优先级(动态规划)
  8. rpm 安装 忽略依赖_rpm 解决依赖的方法
  9. jquery.form.js java_教javascript函数和jquery函数的使用$(form).submit(function()
  10. windows server 2003产生的 Minidmp蓝屏文件分析求助
  11. 交友 它能让霍金有一口伦敦腔,也在帮聋哑人重新开口说话
  12. 【Web】CSS(No.33)Css页面布局经典案例(三)《京东首页》
  13. java小练习:乘法表的实现(不止是9)
  14. 在word表格中如何快速清除表格内容?
  15. 华为手机灵敏度设置_华为调屏幕灵敏度设置方法
  16. 同一页面显示不同内容
  17. 【html】edm 邮件制作指南
  18. Vue中的视频播放插件( vue-video-player )
  19. Python3记录--个人常用函数及资源(持续更新)
  20. 随机数的生成【详解】

热门文章

  1. 【PC工具】更新:在线智能抠图工具,在线视频、图片、音频等转换工具,绿色免安装抠图神奇抠图工具...
  2. MATLAB中plot()画图的颜色线型和希腊字母参数设置
  3. 【Sql server: T-Sql 技术内幕 系列】之索引篇
  4. CSS学习之多类别选择器
  5. C#子线程中更新ui
  6. 判断一棵二叉树是否为AVL树
  7. 【安全牛学习笔记】拒绝服务***工具
  8. 架构设计中服务层的简单理解
  9. Mybatis解决字段名与实体类属性名不相同的冲突
  10. PE文件结构(五岁以下儿童)基地搬迁