“String args[]”和“public static void main(String[] args)”中的static是什么意思?请解释一下。

55

你如何向一个初学者很好地解释以下代码片段中String args[]的含义和static的用法?

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

8
你想解释多少,他们又是多么的初学者呢?当我刚开始学习Java时,我的教授只是说“就是这样”,直到我们开始创建自己的函数之后才解释了String args[]的作用。 - Brian J
5
应该写成String[] args,而不是String args[],否则初学者会永远困惑于数组语法。 - Joel Westberg
2
@Eng.Fouad,那个问题并没有涉及到static。而且,它也不是关于使用args作为输入参数的问题。 - S.L. Barth
2
@JoelWestberg:两种方式都可以接受,不过惯例是将其放在类型周围,而不是变量。然而,有可变参数(varargs)可以作为 main 的签名... - Makoto
2
@Makoto,我知道。但是从我的经验来看,在教授Java入门课程时,最少惊讶原则应该将[]作为类型的一部分而不是变量名称的一部分。 - Joel Westberg
显示剩余3条评论
8个回答

93

我想分手

public static void main(String args[])

在代码中:

public

这意味着您可以从当前类的外部调用此方法。这是必要的,因为该方法由Java运行时系统调用,该系统不位于您当前的类中。


static

当JVM调用main方法时,不存在该类的对象,因此必须具有静态方法以允许从类中调用。


void

Java是一种平台无关的语言,如果返回某些值,则该值可能对不同的平台具有不同的含义。此外,在多线程系统上退出程序的其他方法。详细说明


main

它只是方法的名称。此名称是固定的,并且由JVM作为应用程序的入口点调用。


String args[]

这些是您的Java应用程序在运行时接受的类型为String的参数。


34

我会将初学者引导到Main函数的维基百科文章,并补充以下内容。

  • Java仅使用特定的public static void main(String[] args)签名来启动程序,可以将签名视为自己的名称-这就是Java可以区分其他人的main()和真正的main()之间的区别。

  • String[] args是由空格分隔的String集合,可以在终端上键入到程序中。 大多数情况下,初学者不会使用此变量,但它总是在那里以防万一。


1
@Abcd:可能会有初学者想要传递命令行参数的情况,但老实说,并不是每次运行应用程序都需要这样做。 - Makoto
1
它从未被使用,那么将其放置在哪里有什么用处呢? - user6110959
仅返回翻译文本。 - user6110959
它仍然可以工作 :( - user6110959
1
@Abcd 它可能在 BlueJ 等 IDE 中工作,但它不会与每个 Java 编译器或 IDE 兼容,因为根据 Java 规范,它不应该在没有它的情况下工作。 - Nathan
显示剩余4条评论

17
public static void main(string [] args)

public 表示访问修饰符,意味着我们可以从任何地方访问它; static 表示访问修饰符,这意味着我们可以使用类名直接调用此方法,而无需创建对象; void 表示返回类型; main 是方法名称; string [] args - 它只接受字符串类型的参数…并将其存储在字符串数组中。


8
  • public:这是一个访问限定符,表示可以公开访问。
  • static:这是一个访问修饰符,表示当Java程序加载时,它会自动在内存中创建空间。
  • void:这是一个返回类型,即不返回任何值。
  • main():这是一个方法或函数名。
  • string args[]:这是一个命令行参数,它是一个字符串格式的变量集合。

3
如果我要向某人解释这个,我会说我们稍后再详细讲解,现在你需要知道运行程序的方法是使用:
public static void main(String[] args) {
        ...
    }

假设他/她知道什么是数组,我会说args是一个参数数组,您可以展示一些很酷的例子。

然后在谈到Java/JVM和相关内容后,你最终会谈到修饰符,比如static和public。

然后您可以花点时间谈论这些的含义(据我所见)。

您还可以提到其他“酷”的东西,比如Java的后续版本中可以使用的varargs。

public static void main(String ...args) {
        //...
    }

1
我只是想在这个问题上提供一些帮助。尽管其他人已经回答得很好了。
完整的主方法声明应该是:
 public static void main(final String[] args) throws Exception {

 }

参数被声明为final,因为从技术上讲它们不应该被更改。它们是由用户给出的控制台参数。
通常应该指定main方法会抛出异常,这样堆栈跟踪就可以轻松地回显到控制台,而无需执行e.printStackTrace()等操作。
至于数组语法,我更喜欢这种方式。我想这有点像法语和英语之间的区别。在英语中,是“a black car”,而在法语中是“une voiture noire”。哪个是重要的名词,车还是黑色?
我不喜欢这种东西:
String blah[] = {};

重要的是,它是一个字符串数组,因此应该是:
String[] blah = {};

"blah"只是一个名称。我个人认为,在Java中有时可以以那种方式声明数组,这可能是一个错误。


2
好的..表单的声明: String blah[] = {}; 是在Java的后期版本中包含的,以帮助来自C和C++背景的程序员。 - Vikas
有趣,但对于像我这样的编程新手来说很困惑:(String[] args)与(String args[])。如果应该是String[],那就遵循它。 - SamAndrew81
1
这是Java所遭受的仅有少数“风格”问题之一。经典问题是你放置花括号的位置,这是办公室无休止争论的源泉。我喜欢“埃及符号表示法”,但我的一些同事不喜欢,我深恶痛绝。坚持下去吧,Java已经不再流行年轻一代了,但他们认为JSON是XML的替代品,所以我会对他们说的话持保留态度。 - Richard

1
为了保持初学者的态度,您可以解释所有命令行都会自动分割成一个字符串数组(String[])。
对于static,您需要解释它不像其他字段一样:即使您有数千个类的实例,它在JVM中是唯一的。
因此,main是静态的,因为这是在jar中找到它(链接在其自己的类中)的唯一方法。
当您查看编码时,您的工作就开始了。

确切地说,这对于初学者来说有点复杂。你是否使用多个加载器的主类?我无法猜测出如何使用模式或实用程序来完成这个任务。 - cl-r

0

static 的正常用法是直接访问函数而不需要创建任何对象。就像在 Java 中的 main 方法,我们无法为该类创建任何对象来调用它。它将自动执行。如果我们想手动执行,我们可以在类内使用 main() 调用,从类外部使用 ClassName.main 调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接