主要方法有int,Object和String [] args

时间:2015-12-02 05:38:20

标签: java java-8 main-method

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

java MainTest 1 2 3

我会得到输出:

  

String main 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的主要方法?这甚至可能吗?我认为这只能用String[] args

  • 我希望在运行时收到错误消息。为什么我在应用程序运行时没有出现任何错误?这是否意味着传递的参数总是被解析为String并且Java获得最适合的主要方法?

非常感谢!!

6 个答案:

答案 0 :(得分:2)

示例显示了重载

主要方法已超载。

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获取主要方法

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

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

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

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方法。如上所述,它并不关心该名称的其他方法。

答案 3 :(得分:0)

在java中正好具有签名的方法:

public static void main(String[] args)

拥有特殊权利并考虑主要方法。其他只是重载方法。

答案 4 :(得分:0)

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

根据我的理解,它仅取决于您的要求。

答案 5 :(得分:0)

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

public static void main(String[] args)

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