我从互联网上获得了以下代码,即使有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]);
}
}
在同一个班级中是否需要多个主要方法?
我还没有使用int
,Object [] args
的主要方法?这甚至可能吗?我认为这只能用String[] args
。
我希望在运行时收到错误消息。为什么我在应用程序运行时没有出现任何错误?这是否意味着传递的参数总是被解析为String
并且Java获得最适合的主要方法?
非常感谢!!
答案 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在启动时不会调用那些其他主要方法。