理解Java中“public static void main”中的“static”
以下几点解释了 main() 方法中的“静态”是什么:
- main() 方法: Java中的 main() 方法是 JVM(Java虚拟机)进入Java程序的入口点。 JVM 通过调用 main() 方法来启动Java程序。
- 静态是一个关键字。在任何实体之前添加静态的作用是使该实体成为类实体。这意味着在方法和变量之前添加静态,分别使它们成为类方法和类变量,而不是实例方法和实例变量。
因此,静态方法和变量可以在 Class 的帮助下直接访问,这意味着无需创建对象即可访问静态方法或变量。
// Making a function as static
static void func()
{}
// Making a variable as static
static int var;
- 静态方法:当一个方法用 static 关键字声明时,它被称为静态方法。如上所述,可以在创建其类的任何对象之前访问任何静态成员,并且无需引用任何对象。
// Making a static function
class GfG
{
static void func()
{}
}
// Calling a static function
GfG.func();
- 静态 main() 方法:当 main() 方法的函数定义中添加 static 关键字时,称为静态 main() 方法。
class GfG
{
// Making a static main function
public static void main(String[] args)
{}
}
main() 方法中需要静态:由于 main() 方法是任何Java应用程序的入口点,因此由于以下原因,必须将 main() 方法设为静态:
- 静态 main() 方法使 JVM 调用它来启动Java应用程序非常清楚。否则,需要为每个Java应用程序构建指定入口函数,以便 JVM 启动应用程序。
- 该方法是静态的,因为否则应该调用哪个构造函数会产生歧义。
例如,如果类如下所示:
public class GfG{
protected GfG(int g){}
public void main(String[] args){
}
}
- JVM 现在进入一个模棱两可的状态,决定它是否应该调用 new GfG(int)?如果是,那么它应该为 g 传递什么?如果不是,那么 JVM 是否应该在不执行任何构造方法的情况下实例化 GfG?
像这样的边缘情况和歧义太多了,以至于 JVM 在调用入口点之前必须实例化一个类是有意义的。这就是为什么 main 是静态的。 - main() 方法是静态的,因为它对 JDK 很方便。考虑一个不强制将 main() 方法设为静态的场景。然后在这种情况下,这只会让各种 IDE 更难自动检测项目中的“可启动”类。因此,将入口方法“main()”设置为“public static void main(String[] args)”很方便。
如果我们在 main 方法之前不写“static”会怎样:如果我们在 main 方法之前不写“static”,那么我们的程序将被编译而不会出现任何编译错误。但在执行时,JVM 会搜索公共、静态、返回类型和字符串数组作为参数的 main 方法。如果没有找到这样的方法,则在运行时会产生错误。
Java
/*package whatever //do not write package name here */
import java.io.*;
class GFG {
public void main (String[] args) {
System.out.println("GFG!");
}
}
输出:将显示一条错误消息,如下所示