概述

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

public static void main(String[] args){

}

我们可以在方法签名当中加上final关键字,也可以修改方法的参数的定义方式,但无论如何,一个main方法必须要是static的,返回类型为void的,且是public的。为什么java中的main方法要这么设计和规定呢?下面我们就围绕以下三个问题来分析java中的main方法。

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

关于static关键字我们知道的是,static关键字修饰的方法,可以不用通过创建一个类的实例,而是直接通过类名直接去访问。例如下面代码中调用methodA这样:

public class TestA{

public static void methodA(){

}

public void methodB(){

TestA.methodA();

}

}

并且, 从内存角度来说static修饰的方法以及变量存储在虚拟机当中的方法区当中,而非堆内存当中。

那么,对于虚拟机来说也是一样的道理。main方法定义为static的,则对于虚拟机来说,在程序启动之后并不需要创建一个实例,也就可以去调用这个main方法。

而如果main方法不定义为static的话,虚拟机就需要设计成去new一个包含main方法的类的实例,再去调用这个main方法。这个时候就会存在一个问题,若这个类存在不止一个构造方法,虚拟机是无法决定使用哪个构造方法去创建实例的。

当然,从我个人理解的角度,java虚拟机可以实现为解析非static的main方法,因为它可以规定自己使用默认的构造方法去初始化一个类,然后再去调用main方法即可,只是这相对而言会麻烦一些。从这个层面来讲我们也可以认为这是java虚拟机的一个约定。

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

void是java的main方法的返回值,理解返回值应该从方法调用者的角度去理解,java的main方法的调用者是java虚拟机,而java虚拟机在启动java程序时,只需要调用main方法,而不需要此方法返回任何的值,因此,main方法被设计为void的。

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

Java设计了几个访问修饰符,包括:private,protected,public。 在Java中声明为public的任何方法或变量都可以从该类的外部访问。 而JVM访问main方法显然不是在类的内部访问,因此main方法需要定义为public的方法。

其他

从java诞生的历史背景来看,有的问题就会更好理解。写过c语言程序的话,就会发现java的main方法定义事实上和c语言是十分相似的,而c语言的main方法就是需要用static关键字修饰。从这一角度也可以说Java这门语言在诞生之初本来就是故意设计成C程序员熟悉的。

java中main函数的值是_java基础-main方法相关推荐

  1. java中sort函数comparator的使用_Java Comparator comparingInt()用法及代码示例

    compareInt(java.util.function.ToIntFunction)方法接受一个函数作为参数,从类型T中提取一个int排序键,并返回一个与该排序键进行比较的Comparator.返 ...

  2. java中的静态变量的作用域_Java基础学习03-变量、常量、作用域

    在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ; Java语言支 ...

  3. java中的常用的文件流_Java 基础(四)| IO 流之使用文件流的正确姿势

    image.png 一.什么是 IO 流? 想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中.那这个看似简单的过程,背后其实是数据的传输. 数据的传输,也就是数据的流动.既 ...

  4. java 菜单 分隔符_在Java中使用分隔符连接值列表最优雅的方法是什么?

    我从来没有找到一个整洁(呃)的方式来做以下事情. 说我有一个列表/数组的字符串. abc def ghi jkl 我想将它们连接成一个由逗号分隔的单个字符串,如下所示: abc,def,ghi,jkl ...

  5. java中short的取值范围_java中byte、short、int、long、float、double取值范围

    基本类型 1.整数:包含int,short,byte,long 2.浮点型:float,double 3.字符:char 4.布尔:boolean 分析基本数据类型的特点,最大值和最小值. 1. 基本 ...

  6. java中如何实现变量可配置_Java基础-如何配置环境变量

    Java环境变量详细教程 第一步.打开电脑环境变量设置窗口 以Win10系统为例子. 在桌面找到此电脑,右键此电脑- ->属性,点击属性- ->点击左侧高级系统设置 点击高级系统设置 点击 ...

  7. java中时间与怎么判断过期_java标记过期方法

    ava注解:@Deprecated(不建议使用的,废弃的), @SuppressWarnings(忽略警告,达到抑制编译器产生警告的目的) @Deprecated可以修饰类.方法.变量,在java源码 ...

  8. java中super可以重新父类么_Java Super 覆盖方法

    子类从父类中继承方法,有时候,子类需要修改父类中定义的方法的实现,这称作方法覆盖. 比如,GeometricObject类中的toString方法返回表示集合对象的字符串,这个方法就可以被覆盖,返回表 ...

  9. Java中split函数的用法及使用示例

    Java中split函数的用法及使用示例 2010-05-04 10:21 日志原文:http://lhgc.blog.sohu.com/80444801.html java.lang.string. ...

最新文章

  1. EngineRoot是在哪里定义的?
  2. 烂泥:centos安装及配置DNS服务器
  3. android wear换表盘,Ticwear系统使用watchmaker更换表盘教程
  4. 解决PowerDesigner 16 Generate Datebase For Sql2005/2008 对象名sysproperties无效的问题
  5. 云原生环境下对“多活”架构的思考
  6. 微博粉丝精灵_腾讯与精灵宝可梦公司宣布合作开发新游戏
  7. java alt是什么意思_java中这都是什么意思? - 执着的笨蛋 - BlogJava
  8. hdu 5154 Harry and Magical Computer
  9. 2023计算机毕业设计SSM最新选题之javaEE的仓库管理系统93c6b
  10. JanusGraph批量导入数据优化
  11. python电子病历交接班系统_嘉和电子病历系统用户手册
  12. ubuntu18.04 netplan 设置dns,dns不生效
  13. 2016计算机技术操作考试题,2016年计算机二级《VB》上机操作题(1)
  14. 线性代数-MIT 18.06-5(b)
  15. 【2021】Structure-Preserving Deraining with Residue Channel Prior Guidance
  16. 自动驾驶开发中的地图
  17. 佛山市妇幼保健院 CIO 马丽明:以超融合加速智慧妇幼信息化建设
  18. Python 乘法口诀
  19. Unity中OnRenderImage屏幕后处理做Graphics.blit时遇到的一个问题
  20. Java中的函数式编程(二)函数式接口Functional Interface

热门文章

  1. 显示墙 显示服务器地址,云墙怎么看服务器地址
  2. 2019级C语言大作业 - 火柴人试炼之地
  3. “C 不再是一种编程语言”
  4. 1.2亿次下载,近3万Star的开源项目是为何会“死”掉?
  5. 四周年了,谈谈一个程序员的职场心得
  6. “我想再当一次 CEO,所以我离开了 IBM。”
  7. 应用内广告帮助乐易实现收入+玩家时长双丰收
  8. 产品经理与程序员段子都是从哪来的
  9. C++20 即将于年底发布,C++ 23 提上日程!
  10. 28 岁裸辞转行程序员,一年的心路历程大曝光