我最近在考试中被问到方法的public static void main(String arg[])
格式main
是否固定?我们可以改变它吗?我们可以main
在没有任何public
,static
或的情况下使用void
吗?如果不是,为什么不硬编码main(String arg[])
代表public static void main(String arg[])
永远?
9 回答
main 方法的签名在Java 语言规范第 12.1.4 节中指定,并明确指出:
方法 main 必须声明为 public、static 和 void。它必须指定一个声明类型为字符串数组的形式参数(第 8.4.1 节)。
- 必须是
public
,否则无法调用它 - 一定是
static
因为在调用它之前你没有办法实例化一个对象 - 参数列表
String
允许在从命令行执行 Java 程序时传递参数。可以在没有参数的情况下定义它,但这样更实用(并且类似于其他语言) - 返回类型是
void
因为它没有任何意义:Java 程序可以在到达 main 方法的末尾之前终止(例如,通过调用System.exit()
)
因此,方法签名可以是:
public static void main( String[] args )
public static void main( String... args )
请注意,可变参数版本 ( ...
) 仅在 Java 5 中有效
由于 Java 语言允许括号[]
位于类型或变量之后(通常首选第一个),
public static void main( String args[] ) // valid but usually non recommended
也是有效的
如果您查看 JDK 源代码 (jdk-src\j2se\src\share\bin\java.c):
/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
"([Ljava/lang/String;)V");
...
{ /* Make sure the main method is public */
...
mods = (*env)->CallIntMethod(env, obj, mid);
if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
message = "Main method not public.";
messageDest = JNI_TRUE;
goto leave;
...
很明显,它必须只有这个签名。
Public 是一种访问说明符,因此我们可以从类外部访问它。因为 main 是充当执行点的函数。Main 函数由类外部的 JVM 调用,因此必须将其声明为 public。
static 是 java 中使用的一种关键字,用于指定不需要创建它的任何实例。我们知道 main 方法也驻留在类内部,并且要从类外部访问类的特定功能(在这种情况下来自 JVM),需要该特定类的实例,因此为了避免这些,我们只需放置 static访问类外的主要方法。
void 是返回类型,因为 main 方法中的其他返回类型是没有意义的。
String 是 java 中预定义的类名。而 args [] 是数组类型的变量。它是 String 类型对象的变量名。所以我们也可以改变args[]的名字。字符串类及其对象可以作为参数传递到正在运行的程序中,以将信息从命令行传递给 main 方法。
main 方法必须是public
这样才能在加载类时被 JVM 找到。同样,它必须是static
在加载类后可以调用它,而不必创建它的实例。所有方法都必须有一个返回类型,在这种情况下是void.
我无法回答该方法的参数,但它必须是公共的,因为 jvm 必须能够访问该函数并且它必须是静态的,因为 jvm 不知道如何创建您的类的实例。
这篇文章对静态的推理提供了一个很好的详细答案:为什么 Java 主方法是静态的?
这篇文章为 main 为什么是 void 提供了一个很好的答案:Why is main() in java void?
如果不是,为什么不硬编码 main(String arg[]) 总是代表 public static void main(String arg[]) ?
您可以使用带有任何签名的名为“main”的方法并访问您喜欢的方法。特殊规则仅适用于您希望 JVM 调用以启动程序的方法。
public class Test {
public static void main(String[] args) {
StrangeMain m = new StrangeMain();
System.out.println(m.main());
System.out.println(m.main(new String[]{"aaa","bbb"}));
}
}
class StrangeMain{
protected String main(){
return "xyzzy";
}
protected String main(String[] arg){
return arg[0];
}
}
编译、运行和输出:
xyzzy
aaa
Public static void main(String [] ar)
要理解这一点,我们需要知道方法和数组的语法。
方法的语法是:
返回类型方法名
因此 main 方法与返回类型的 void 一起编写。
数组语法:
数据类型 [] 数组名
方括号表示它是否是维度数组。因为我们有一对方括号,所以它是一维数组。
main方法中单词的含义:
Public:Public 是访问说明符,旨在让 JVM 从任何位置执行 main 方法。
static:static是修饰符。main方法必须声明为static,这样JVM才能通过类名直接访问main方法。
当我们执行一个 java 程序时,我们使用类名,所以当我们编写静态时,它将帮助 JVM 访问 main 方法。
如果我们删除静态,那么它就变成了实例方法,要访问一个实例方法,我们应该创建对象,然后使用对象引用调用该方法。
void : void 是 main 方法的返回类型。main 方法的调用者是 JVM,JVM 不期望 main 方法有任何值,因此 main 方法不应该返回任何值。这就是指定 Void 的原因。
main : Main 是方法名,它是根据 Java 编码约定固定的。
String[]:用于存储命令行参数。数组名可以是任何有效的Java标识符。
因此,在 String[] 之后,我们可以将 name 作为任何有效的 java 标识符,它可以是 'ar' 或它可以是 'args'。
public-main() 方法必须由类外部和类内部的任何一个使用,因此它的公共
如果我们定义类而不是为该类定义对象,那么静态静态在java中是必需的bcoz,并且仅比我们可以使用该类..但是我们直接使用这个词而不是这个词静态
void-for main() 不能返回任何值,如 int 或 char main()-main 是我们可以用来访问 java 未来的函数或方法 String-在 java 中,我们编写的所有内容都视为字符串 args-arguments