TL; DR
在Java中,原因public static void main(String[] args)
是
- 高斯林通缉
- 由具有C语言(不是Java)经验的人编写的代码
- 由曾经在NeWS上运行PostScript的人执行
对于C#来说,推理在传递上是相似的。语言设计者使Java程序员熟悉程序入口点语法。正如C#架构师Anders Hejlsberg所说,
...我们使用C#的方法只是为Java程序员提供了替代方案...
长版
在上面扩展并以无聊的引用作为备份。
java终结者Hasta la vista宝贝!
VM Spec 2.17.1虚拟机启动
...向Java虚拟机指定初始类的方式超出了本规范的范围,但是在使用命令行的主机环境中,通常将类的完全限定名称指定为:命令行参数,以及随后的命令行参数将用作字符串,以作为方法main的参数提供。例如,使用Sun的Java 2 SDK for Solaris,命令行
java Terminator Hasta la vista Baby!
通过调用类的main方法Terminator
(未命名包中的类)并向其传递包含四个字符串“ Hasta”,“ la”,“ vista”和“ Baby!”的数组,将启动Java虚拟机。
...另请参阅:附录:我需要您的衣服,靴子和摩托车
- 我的解释:
执行的目标是像命令行界面中的典型脚本一样使用。
重要的一步
...这有助于避免在我们的调查中出现一些错误的痕迹。
VM Spec,1.2 Java虚拟机
Java虚拟机对Java编程语言一无所知...
在学习上一章-1.1历史时,我注意到上面的内容,我认为这可能是有帮助的(但后来证明是无用的)。
- 我的解释是:
执行仅受VM规范支配,该规范
明确声明它与Java语言无关
=>可以忽略JLS和所有与Java语言相关的所有内容
高斯林:C语言与脚本语言之间的折衷...
基于以上内容,我开始在Web上搜索JVM历史记录。没有帮助,结果中有太多垃圾。
然后,我回想起有关Gosling的传说,并将搜索范围缩小到Gosling JVM历史上。
尤里卡!JVM规范如何成为
在2008年JVM语言峰会的主题演讲中,James Gosling讨论了... Java的创建,... C和脚本语言之间的折衷...
- 我的解释:
明确声明在创建之时,
C和脚本已被视为最重要的影响。
已经看到VM规格2.17.1点头脚本,
命令行参数足以解释String[] args
,但static
和main
现在还没有,需要进一步挖掘...
请注意,在键入此内容时-将C,脚本和VM Spec 1.2与Java无关连接-我感觉有些熟悉,有些…… 面向对象的特性正在慢慢消失。握住我的手,保持前进'别放慢速度,我们现在快到了
主题幻灯片可在线获得:20_Gosling_keynote.pdf,非常方便复制关键点。
第3页
Java的史前史
*是什么影响了我的思维
第9页
新闻
*网络可扩展窗口系统
*基于脚本的窗口系统。
PostScript(!!)
第16页
一个大目标(但安静):
我能走多近
“脚本”的感觉...
第19页
原始概念
*全部关于建筑
物联网
由脚本编排
语言
*(Unix外壳,AppleScript等)
第20页
披着羊皮的狼
* C语法使开发人员
自在
哈!让我们仔细看看C语法。
“你好,世界”的例子...
main()
{
printf("hello, world\n");
}
...正在定义一个名为main的函数。的主要功能用于在C程序中一个特殊的目的; 运行时环境调用main函数开始执行程序。
...主要功能实际上有两个参数,int argc
并char *argv[]
分别可用于处理命令行参数...
我们越来越近了吗?你打赌。上面引用中的“主要”链接也值得关注:
主要功能是程序开始执行的地方。它负责程序功能的高级组织,通常可以在执行程序时访问赋予程序的命令参数。
- 我的解释:
为了让C开发人员满意,程序入口必须为main
。
另外,由于Java要求任何方法都必须在类中,Class.main
因此
与它的实现非常接近:静态调用,仅类名和点,
无构造函数-C对此一无所知。考虑到
易于从Java迁移到C#的想法,
这也可传递地应用于C#
。
欢迎那些认为熟悉程序入口点无关紧要的读者搜索和检查Stack Overflow问题,这些问题来自Java SE的人们正在尝试为Java ME MIDP 编写Hello World。注意MIDP入口点没有main
,也没有static
。
结论
基于以上我要说的是static
,main
和String[] args
是在Java和C#创建最合理的选择时刻定义程序入口点。
附录:我需要你的衣服,靴子和摩托车
必须承认,阅读VM Spec 2.17.1非常有趣。
...命令行
java Terminator Hasta la vista Baby!
通过调用类的main方法Terminator
(未命名包中的类)并向其传递包含四个字符串“ Hasta”,“ la”,“ vista”和“ Baby!”的数组,将启动Java虚拟机。
现在,我们概述了虚拟机可能要执行的步骤Terminator
,以作为加载,链接和初始化过程的示例,这将在后面的部分中进一步描述。
最初的尝试...发现该类Terminator
未加载...
之后Terminator
被加载时,它必须被初始化主可以被调用之前,它被初始化之前一个类型(类或接口)必须被链接。链接(§2.17.3)涉及验证,准备和(可选)解决方案...
验证(§2.17.3)检查所加载的表示形式Terminator
是否正确。
解析(§2.17.3)是检查类中的符号引用的过程Terminator
。
从符号引用Terminator
哦耶。