Java方法的方法签名是:

public static void main(String[] args) {
    ...
}

Is there a reason why this method must be static?

推荐答案

该方法是静态的,因为否则会有歧义:应该调用哪个构造函数?尤其是如果你的班级看起来像这样:

public class JavaClass{
  protected JavaClass(int x){}
  public void main(String[] args){
  }
}

JVM应该呼叫new JavaClass(int)吗?它应该被认为是x吗?

如果不是,JVM是否应该在不运行任何构造函数方法的情况下实例化JavaClass?我认为不应该,因为这将是整个类的特殊情况——有时你有一个尚未初始化的实例,你必须在每个可以调用的方法中判断它.

对于JVM来说,在调用入口点之前必须实例化一个类,有太多的边缘情况和模糊性,这是没有意义的.这就是为什么main是静态的.

我不知道为什么main总是标public.

Java相关问答推荐

在数组中使用意想不到的结果

如何跟踪我在数组中的位置

gitlab ci不会运行我的脚本,因为它需要数据库连接'

无法传递消费者<;>;实例

@ IdClass with @ Inheritance(策略= InheritanceType. SINGLE_TABLE)

为什么在枚举中分支预测比函数调用快?

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

查找剩余的枚举

在Spring终结点中,是否可以同时以大写和小写形式指定枚举常量?

与Spring Boot相关的实体未正确保存

Spring @Value default无法计算表达式

使用OAuth 2.0资源服务器JWT时的授权(授权)问题

没有使用Lombok生成的参数

插入中的JOOQ序列,设置为VS值

如何在ApacheHttpClient 5中为单个请求设置代理?

具有多个分析模式的复杂分隔字符串的正则表达式

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

使用StringBuilder和append方法创建字符串时Java字符串内部方法的问题

message.acknowledge()没有';在使用Spring Boot在ActiveMQ中读取消息后,t将消息出列