【问题标题】:Main Method with int, Object and String [] args带有 int、Object 和 String [] 参数的 Main 方法
【发布时间】:2016-03-06 06:36:42
【问题描述】:

我从互联网上获得了以下代码,即使有 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]);
    }

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

  • 我还没用过intObject [] args的main方法?这甚至可能吗?我以为只有String[] args才有可能。

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


非常感谢!!

【问题讨论】:

  • 通过命令行运行将始终使用main(String[] args) 其他人只是在那里从我假设的其他类调用。或者当类加载和东西时
  • 你可以随意重载,但是从java调用的main方法必须是String[]版本(其中有3个兼容版本的语法)
  • 看到这个question

标签: java java-8 main-method


【解决方案1】:

例子展示了重载

main 方法被重载。

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

是否存在需要多于 1 个 main 方法的情况? 同班?

这仅取决于您的要求

我还没有使用 int, Object [] args 的 main 方法?就是它 甚至可能?我认为只有使用 String[] args 才能实现

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

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

代码非常好,所以你没有收到任何错误。代码描述了一个 main 方法重载的例子

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 实际上并非如此。有 3 种方法可以对它识别的 main 进行编码。 public static void main(String[] args) 是常用的。另外两个我留给读者作为一个谜......
    • <spoiler> 它是public static void main(String args[]) </spoiler>
    • public static void main(String args[]) {}
    • 什么是“完成”?您的回答在技术上仍然不正确。
    • @Bohemian:取决于您将其视为离散的编码方式。如果您将 [] 或 varargs 的替代位置视为一种独特的方式,我会说有不止三种方式。例如,使public 隐含:public interface Example { static void main(String... arg) {} }。您也可以插入注释。我喜欢这个:public interface Example { @Target(TYPE_USE) @interface NonNull {} static void main(@NonNull String@NonNull... arg) { System.out.println("yes, it works"); } }。而且我们还没有谈论泛型……
    【解决方案3】:

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

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

    所以著名的java 启动器使用命令行参数在指定的主类中搜索一个名为main 的特殊方法,该方法具有raw 签名public static void main(java.lang.String[])。请注意,早期的 Java 版本的启动器并不关心 public 修饰符的存在与否。对启动器而言,重要的是它是否找到了这样的main 方法。它不关心其他同名不同签名的方法。它也不关心 other 类是否有合适的 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 方法。如前所述,它不关心该名称的 other 方法。

    【讨论】:

      【解决方案4】:

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

      public static void main(String[] args)

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          public static void main(String[] args)
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-05
            • 2018-09-10
            • 2014-04-10
            相关资源
            最近更新 更多