0

我从互联网上获得了以下代码,即使有 3 种主要方法,如果我从命令提示符运行应用程序:

java MainTest 1 2 3

我会得到输出:

主弦 1

public class MainTest {

    public static void main(int [] args) {
        System.out.println("int main " + args[0]);
    }
    public static void main(Object[] args) {
        System.out.println("Object main " + args[0]);
    }

    public static void main(String[] args) {
        System.out.println("String main " + args[0]);
    }

}
  • 是否存在同一个类中需要超过 1 个主要方法的情况?

  • 我还没有使用主要方法intObject [] args?这甚至可能吗?我以为只有String[] args.

  • 我期待在运行时收到一条错误消息。为什么应用程序运行时我没有收到任何错误?这是否意味着传递的参数总是被解析为String,Java 得到最适合的 main 方法?


非常感谢!!

4

6 回答 6

2

该示例显示重载

main 方法被重载。

JVM 只寻找静态的 main 方法,它应该只接受 String 数组的一个参数。所以你得到String main 了输出

是否存在同一个类中需要超过 1 个主要方法的情况?

这仅取决于您的要求

我还没有使用 int、Object [] args 的 main 方法?这甚至可能吗?我认为只有使用 String[] args 才有可能

我想你想用 Object[] 参数调用 main 方法。public static void main(Object[] args) { 就像任何其他简单方法一样,您可以通过 MainTest.main(new Object{1,2}) 调用它

我期待在运行时收到一条错误消息。为什么应用程序运行时我没有收到任何错误?是不是说传递的参数总是解析成String,Java获取main方法

代码非常好,因此您没有收到任何错误。代码描述了 main 方法重载的示例

于 2015-12-02T05:40:44.383 回答
1

mainJava 编程语言不保留该名称。它是一个普通标识符,因此适用与所有其他标识符相同的规则。您可以命名多个方法main,只要它们具有不同的参数类型即可。这称为方法重载

某个main方法的特殊含义是由初始化你的应用程序的启动器定义的,这个启动过程定义了规则。请注意,启动应用程序可能有不同的、特定于实现的方式,例如,Applets 没有main方法,而 JavaFX 提供了自己的启动器,无需main方法即可工作。这同样适用于几种服务器端 Java 技术。这并不妨碍您main在使用此类技术时声明方法,但它们没有特殊含义。

因此,著名的启动器使用命令行参数在指定的主类中java搜索名为main具有原始签名的特殊方法。public static void main(java.lang.String[])请注意,早期的 Java 版本的启动器并不关心public修饰符的存在与否。对启动器而言,重要的是它是否找到了这样的main方法。它不关心其他同名不同签名的方法。它也不关心其他类是否有适当的main方法。它所做的只是在指定的类中搜索合适的方法。

由于只有方法的原始(字节码级别)签名很重要,它具有哪种源代码形式无关紧要,只要它被编译为具有适当签名的方法即可。因此,以下声明将导致main适用于启动 Java 应用程序的方法:

public static void main(String[] arg) {}
public static void main(String arg[]) {} // source code variantion don’t matter
public static void main(String... arg) {} // varargs are compiled to an array type
public static final void main(String[] arg) {} // final is irrelevant

public interface Example {
    static void main(String[] arg) {} // public is implied (Java 8)
}

public static <T extends String> void main(T[] arg) {} // raw parameter type is String[]

请注意,对于最后一个变体,某些 IDE 无法启动应用程序(尽管它可以从命令行运行),这表明实际行为取决于启动器的实现。

相反,以下方法不起作用:

class String{}
public static void main(String[] arg) // the parameter type is not java.lang.String[]

证明,不是源代码形式而是编译的原始签名很重要。当尝试运行最后一个示例时,启动器会抱怨它没有找到所需的方法public static void main(String[]),而不是告诉你有一个不同的、不匹配的main方法。如前所述,它不关心该名称的其他方法。

于 2015-12-02T09:55:08.803 回答
1

JVM只会在下面识别为main method.

public static void main(String[] args){} 将在 JVM 启动您的类时使用。

JVM也public static void main(String args[]) {}可以使用。

public static void main(String[] args) {
        System.out.println("String main " + args[0]);
    }

剩下的就是overloaded方法

我们也可以使用varargs签名,因为这相当于JVM标准

public static void main(String... args)

的位置public and static可能会发生变化。

来自JavaDocs

于 2015-12-02T05:40:30.697 回答
0

在java中,该方法具有完全低于签名:

public static void main(String[] args)

具有特殊权限并考虑了 Main 方法。其他只是重载的方法。

于 2015-12-02T05:42:07.023 回答
0

您正在定义简单的方法,除了 public static void main(String[] args) 之外,JVM 不会直接调用它们。所以这取决于您的要求,您需要一个具有重载概念的方法并且它是静态的,因此可以使用类名直接调用它。

据我了解,这仅取决于您的要求。

于 2015-12-02T05:43:15.530 回答
0

您可以编写任意数量的静态主方法,但 JVM 正在寻找特定的主方法签名

public static void main(String[] args)

任何其他主要方法都将存在(并且可以被其他一些 Java 元素调用),但这些其他主要方法不会在启动时被 JVM 调用。

于 2015-12-02T06:02:20.173 回答