Java main()方法的方法签名为:
public static void main(String[] args){
...
}
此方法是否有理由是静态的?
#1楼
我认为关键字“ static”使main方法成为类方法,并且类方法只有它的一个副本,并且可以被所有人共享,而且,它不需要对象作为参考。 因此,在编译驱动程序类时,可以调用main方法。 (我只是在Java的字母级别,如果我错了,抱歉)
#2楼
main()是静态的,因为; 在应用程序生命周期的这一点上,由于还没有实例化对象,因此应用程序堆栈本质上是过程性的。
这是一块干净的石板。 此时,即使没有声明任何对象,您的应用程序仍在运行(请记住,存在过程和OO编码模式)。 您作为开发人员,通过创建对象实例并根据其中编译的代码,将应用程序变成面向对象的解决方案。
面向对象之所以伟大,有数百万个显而易见的原因。 但是,大多数VB开发人员在其代码中定期使用诸如“ goto”之类的关键字的日子已经一去不复返了。 “ goto”是VB中的一个过程命令,由其OO对应部分替代:方法调用。
您也可以将静态入口点(main)视为纯粹的自由。 如果Java具有足够的差异来实例化一个对象,并且仅在运行时向您呈现该实例,那么您将没有选择但是要编写一个过程应用程序。 对于Java来说,这听起来是难以想象的,但可能有许多情况需要使用过程方法。
这可能是一个非常模糊的答复。 记住,“类”仅仅是相互关联的代码的集合。 “实例”是该类孤立,生活和呼吸自发的一代。
#3楼
任何应用程序的真正入口都是静态方法。 如果Java语言支持将实例方法作为“入口点”,那么运行时将需要在内部将其实现为静态方法,该方法构造对象的实例,然后调用该实例方法。
鉴于此,我将研究选择以下三个选项之一的基本原理:
今天我们看到的是一个static void main() 。
在新构造的对象上调用的实例方法void main() 。
使用类型的构造函数作为入口点(例如,如果入口类称为Program ,则执行将有效地包含new Program() )。
分解:
static void main()
调用封闭类的静态构造函数。
调用静态方法main() 。
void main()
调用封闭类的静态构造函数。
通过有效地调用new ClassName()构造封闭类的实例。
调用实例方法main() 。
new ClassName()
调用封闭类的静态构造函数。
构造该类的实例(然后不执行任何操作,仅返回)。
理由:
我将按照相反的顺序进行操作。
请记住,Java的设计目标之一是强调(尽可能要求)良好的面向对象编程实践。 在这种情况下,对象的构造函数将初始化该对象,但不应对该对象的行为负责。 因此,给出new ClassName()入口点的规范将在每个应用程序上强制“理想”构造函数的设计例外,从而使新Java开发人员感到困惑。
通过将main()用作实例方法,可以解决上述问题。 但是,它通过要求规范列出条目类的构造函数的签名以及main()方法的签名而增加了复杂性。
总而言之, 指定static void main()会创建具有最低复杂度的规范,同时遵守将行为放入方法中的原则 。 考虑到实现main()方法本身直接构造一个类的实例并调用一个实例方法有多简单,将main()指定为实例方法并没有真正的优势。
#4楼
正如我们在这里看到的那样,这只是一个约定:
该方法必须声明为public和static ,它不能返回任何值,并且必须接受String数组作为参数。 默认情况下,第一个非选项参数是要调用的类的名称。 应该使用标准的类名。 如果指定了-jar选项,则第一个非选项参数是JAR归档文件的名称,该文件包含应用程序的类和资源文件,且启动类由Main-Class清单标头指示。
#5楼
public static void关键字意味着Java虚拟机(JVM)解释器可以调用程序的main方法来启动程序(公共),而无需创建类的实例(静态),并且程序不会将数据返回给Java VM解释器(无效)何时结束。