为什么 main 方法是 public static void ?

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加载到内存的时候就被执行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

返回地址【数据结构】

小问题? 1.我们是如何根据地址值来找到我们对应的数据的? 详细陈述一下:当我们开辟一个整数类型,取名为a,假设地址空间是从数值为2000进行存储,并且我们假设整形占用4个字节,那么我们在内存中需…

【超级详细的小白教程】Hexo 搭建自己的博客

– 前言 这是一篇有关如何使用 Github Pages 和 Hexo 搭建属于自己独立博客的详尽教程,本人是软件工程专业本科生,目前只学习了C和C编程语言,对网站开发的有关知识几乎为零,这也是我搭建好自己的博客之后写的第一篇博客&#xff…

面向对象思想精华总结

一、三大特性 封装继承多态 二、类图 泛化关系 (Generalization)实现关系 (Realization)聚合关系 (Aggregation)组合关系 (Composition)关联关系 (Association)依赖关系 (Dependency) 三、设计原则 S.O.L.I.D其他常见原则 参考资料 一、三大特性 封装 利用抽象数据类型将数据…

数组名与指向数组的指针之间的联系与区别【数据结构】

我们遇到一个非常棘手的问题,这个问题就是,对于一堆数据来说,我们进行存储,放到一个指定的仓库当中,先前我们使用数组加加标的形式进行访问仓库当中的元素位置,但是呢,现在我们使用的是一个指针…

Struts2的action中处理JSONP方式提交的中文乱码问题:

昨天在做公司网站的时候出现了一个中文乱码问题,让我郁闷了一晚上和一上午,最后在网友的提示下,我终于解决了,现在写出来供后来的兄弟们参考: 1.问题是这样的,就是客户端是以JSONP的方式提交的数据&#x…

leetcode509. 斐波那契数(矩阵快速幂)

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 给定 N,计算 F(N)。…

insert函数的修改,

我们来看一下图片当中的第2个圆圈,为什么使用size来相加呢?我们知道一开始我们定义的初始空间为init_size;我们想一下啊,如果是第1次进行空间的增加,那么我们使用InIt来进行相加是可以的,但是当第2次想加我们再想开辟空…

leetcode520. py解字符串真是太残暴了

给定一个单词,你需要判断单词的大写使用是否正确。 我们定义,在以下情况时,单词的大写用法是正确的: 全部字母都是大写,比如"USA"。 单词中所有字母都不是大写,比如"leetcode"。 如果…

【数据结构】线性表大咖

循环链表的介绍 概念:链表的最后一个节点的指针,由原来的 空指针变成指向第1个节点的链表。 类比:我们进行串珠子的操作,将首尾通过线进行连接,同样我们的链表就是通过指针指向的方式进行连接,使其成为一…

leetcode551. 学生出勤记录 I

给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: A : Absent,缺勤 L : Late,迟到 P : Present,到场 如果一个学生的出勤记录中不超过一个A(缺勤)并且不超过两个连续的L(迟到),那么这个学生会被奖…

一元多项式的表示和相加【数据结构】

一元多项式的表示和相加 运算只是一个定义,一切的一切,到最后都必须归咎于存储结构当中,实现物理存储,一元多项式包括数据对象数据关系以及数据之间的各种操作, 一元多项式的实现:用带表头结点的有序链表…

线性结构基本概念【数据结构】F

线性表的概念:线性表是一种最简单的线性结构,线性结构是单个数据元素的有序结合 线性结构的基本特征为: 第一,集合中必存在唯一的一个第1元素, 第二,集合中必存在唯一的一个最后元素, 第三&am…

leetcode589. N叉树的前序遍历

给定一个 N 叉树&#xff0c;返回其节点值的前序遍历。 例如&#xff0c;给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4]。 思路&#xff1a;先放入自己&#xff0c;再依次遍历孩子。 /* // Definition for a Node. class Node {public int val;public List<Node> c…

ORA-00001 违反唯一约束条件

程序跑出下面的异常&#xff1a;com.ibm.websphere.ce.cm.DuplicateKeyException: ORA-00001: 违反唯一约束条件 (EOMS3.SYS_C0024492)&#xff0c;参考下面的文章了解到我的程序可能是序列的问题。&#xff08;果然是序列产生的最小值设置的太小&#xff0c;将序列值设置大之后…

顺序结构实现【数据结构】

虽然在数据结构当中是先出现的线性表&#xff0c;然后出现的是数组 一&#xff1a;线性表的顺序存储结构 顺序映象&#xff1a;用一组地址连续的存储单元依次存放线性表当中的数据元素 线性表的起始地址&#xff1a;线性存储第一个数据元素的地址&#xff0c;我们也称作是基地址…

leetcode590. N叉树的后序遍历

给定一个 N 叉树&#xff0c;返回其节点值的后序遍历。 例如&#xff0c;给定一个 3叉树 : 思路&#xff1a;先遍历所有孩子&#xff0c;再放入自己。 /* // Definition for a Node. class Node {public int val;public List<Node> children;public Node() {}public No…

链表的形式【F】

数据元素之间的关系在计算机中有两种表示方法: 顺序映象, 非顺序映象. 对应两种存储结构: 顺序存储结构, 链式存储结构 线性结构就是一种逻辑关系&#xff0c;方便我们对数据进行研究但是不考虑真实的存储结构 数据是什么&#xff1f; 数据是能够反应一定内容的一组数据类型的…

leetcode892. 三维形体的表面积

在 N * N 的网格上&#xff0c;我们放置一些 1 * 1 * 1 的立方体。 每个值 v grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。 请你返回最终形体的表面积。 示例 1&#xff1a; 输入&#xff1a;[[2]] 输出&#xff1a;10 示例 2&#xff1a; 输入&#xff1a;…

leetcode914. 卡牌分组

给定一副牌&#xff0c;每张牌上都写着一个整数。 此时&#xff0c;你需要选定一个数字 X&#xff0c;使我们可以将整副牌按下述规则分成 1 组或更多组&#xff1a; 每组都有 X 张牌。 组内所有的牌上都写着相同的整数。 仅当你可选的 X > 2 时返回 true。 示例 1&#xf…

单链表的实现【数据结构】

思考&#xff1a; 1.是否能够将原来指针的方向改为向前指向呢&#xff1f; 2.是否能够有两个指针域的操作呢&#xff1f; 了解&#xff1a; 单链表是应用最广泛的一种形式&#xff0c;还有双向链表以及循环链表&#xff0c;这些都是要进行讨论的 结构体定义的是什么&#xff1f…