2012-04-05 85 views

回答

22

主要方法的签名在Java Language Specifications section 12.1.4规定,并明确规定:

The method main must be declared public, static, and void. It must specify a formal parameter (§8.4.1) whose declared type is array of String.

  • 它必须是public否则就不可能把它
  • 那一定是因为你static在调用它之前没有办法实例化对象
  • 参数String的列表允许从命令行执行Java程序时传递参数。它有可能没有参数地定义它,但是更实用(类似于其他语言)
  • 返回类型为void,因为它没有任何意义:Java程序可以在到达之前终止主要方法的结尾(例如,通过调用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 

也是有效

+0

你可以很容易地创建一个新的启动器,它可以以不同的方式完成,方法不必是公开的(JNI接口允许你调用任何**方法),它不一定是静态的,JNI接口可以通过调用它的构造函数再次创建任何对象**,然后调用实例方法。 – 2012-04-05 12:53:36

+3

@MaurícioLinhares我完全知道我可以打电话给我想要的任何东西,但不能保证它能正常工作。一个JVM(还有其他JVM也不是来自Oracle)只是被迫遵循规范。他们可能只是产生一个错误,并告诉你“没有办法,即使技术上可行,也不是标准的”。规范被称为规范的原因。 – Matteo 2012-04-05 12:56:42

+0

**不能保证它会工作**?你是什​​么意思?我的个人发射器无法工作,因为规范说明了吗?任何启动程序**都可以工作**只要所启动的类符合标准,请检查其他答案和源代码示例。 – 2012-04-05 12:58:37

0

主要的方法必须是public,所以当类加载时,它可以被JVM找到。同样,它必须是static,这样才能在加载该类之后调用它,而不必创建它的一个实例。所有的方法必须有返回类型,在这种情况下,它是void.

+0

所以我们可以有一个非空的返回类型吗?我是新来的java – amar 2012-04-05 12:35:32

+0

@amar不,它必须是无效的,因为它在语言规范中被定义为 – Matteo 2012-04-05 12:48:31

0

我无法回答该方法的参数,但它必须是公开的,因为jvm必须能够访问该函数并且它必须是静态的,因为jvm不知道如何创建你的类的实例。

这篇文章提供了关于推理静态的好详细的解答:Why is the Java main method static?

这篇文章提供了为什么主要是无效的一个很好的答案:Why is main() in java void?

-2

你可以,如果你创建了一个新的Loader改变你的应用。 public static void main(String args []) format仅仅是默认的解决方案,人们在JVM上发现调用你的Java程序,所以有一个明确的方法来做到这一点。

真正实现我们今天只是使用JNI接口使用this function调用公共静态无效的主要(字符串ARGS [])方法,因此,如果你想使用JNI,你可以很容易地写完全相同的代码和有不同的方法来加载你的应用程序。

Here's an example in code它取自this page

这是当前的linux启动程序the method lookup starts here

+0

您确定吗?我的热点源代码有硬编码:'(* env) - > GetStaticMethodID(env,mainClass,“main”, “([Ljava/lang/String;)V”);' – Voo 2012-04-05 12:41:58

+0

不是在语言规范中定义的,只有按照定义实施才能保证工作。任何不符合规格的东西都不能保证正常工作。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.1.4 – Matteo 2012-04-05 12:45:04

+0

当然是,请检查启动器的源代码。 https://gist.github.com/2310831#L465 – 2012-04-05 12:50:21

2

如果你看看JDK的源代码(JDK-SRC \ J2SE的\ src \共享\ 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; 
... 

它变得非常清楚,它必须只有这个签名。

+3

我同意但JDK代码不是正确的参考。语言规格是 – Matteo 2012-04-05 12:53:16

+1

该规范的实现不是正确的参考?这一个吹了我。 – 2012-04-05 12:56:39

+9

否*一个规范的实现不是一个参考。甚至可能是错的。没有*执行。只有* an *实现。 – Matteo 2012-04-05 12:59:09

-2
  • 公共主()必须通过的任一个一起使用的方法的类的外部以及所述类内部,从而它的公共

  • 静态静电是必要bcoz在Java如果我们定义类比我们为该类定义的对象,并且只有比我们可以使用该类...而不是我们直接使用写入单词静态

  • void-for main()不能返回任何值,如int或char main() - main是我们可以用来访问java的未来的函数或方法 字符串在Java中所有我们写考虑作为一个字符串 ARGS论点

0

If not, why is it not hard coded that main(String arg[]) would stand for public static void main(String arg[]) always?

你可以有方法称为“主”与你喜欢的任何签名和访问。特殊规则仅适用于您希望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 
1

公开是一种访问符由于我们可以从类的外部访问。由于main是充当执行点的函数。主函数由类之外的JVM调用,因此它必须声明为public。

static是java中用来指定不需要创建任何实例的关键字。正如我们所知,main方法也驻留在类中,并且从类外部访问类的特定功能(在这种情况下来自JVM),因此需要该特定类的实例,因此为了避免这些,我们只需将静态访问课堂外的主要方法。

Void是返回类型,因为main方法中的其他返回类型是无意义的。

字符串是java中的预定义类名。而args []是数组类型的变量。它是一个String类型对象的变量名称。所以我们也可以改变args []的名字。字符串类及其对象可以作为参数在正在运行的程序中传递,以便将信息从命令行传递给主方法。

0
   Public static void main(String [] ar) 

为了理解这一点,我们需要知道方法和数组的语法。方法的

语法是:

返回类型方法名

所以主要方法与空隙是返回类型一起被写入。

语法阵列:

数据类型[] arrayName中

的方括号指示它是否是维阵列。既然我们有一对正方形的牙套它是一个维阵列。

字中的主要方法的含义:

公共:公用是访问指示符意为JVM的目的从任何地点执行的主要方法。

静态:静态是一个修饰符。主要方法必须声明为静态,以便JVM可以直接使用类名称访问主要方法。

当我们执行一个java程序时,我们使用类名,所以当我们写静态时它将帮助JVM访问主要方法。

如果我们删除静态,那么它将成为实例方法,访问我们应该创建的实例方法和对象,然后使用对象引用调用方法。

void:void是主方法的返回类型。主要方法的调用方是JVM,JVM不期望主方法有任何值,因此主方法不应返回任何值。这是指定Void的原因。

main:Main是方法名,它是根据Java编码规范修复的

String []:它用于存储命令行参数。数组的名称可以是任何有效的Java标识符。

所以在String []之后,我们可以给任何有效的java标识符命名,它可以是'ar',也可以是'args'。

相关问题