[英]Main Method with int, Object and String [] args
我從互聯網上獲得了以下代碼,即使有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個main方法的場景?
我還沒有使用int
的main方法, Object [] args
? 那有可能嗎? 我以為只有String[] args
才有可能。
我期待在運行時收到錯誤消息。 為什么在運行應用程序時沒有出現任何錯誤? 這是否意味着傳遞的參數總是被解析為String
而Java獲得了最適合的主要方法?
非常感謝!!
該示例顯示了重載
主要方法是重載。
JVM只查找靜態的main方法,並且它僅應接受String數組的一個參數。 所以你得到String main
作為輸出
在同一個類中是否有需要多個1個main方法的場景?
只看你的要求
我尚未將int的主要方法用於Object [] args? 那有可能嗎? 我以為只有String [] args才有可能
我認為您想使用Object []參數調用main方法。 public static void main(Object [] args){與其他任何簡單方法一樣,可以通過MainTest.main(new Object {1,2})調用它
我期待在運行時收到錯誤消息。 為什么在運行應用程序時沒有出現任何錯誤? 這是否意味着始終將傳遞的參數解析為String,而Java獲得了main方法?
該代碼非常完美,因此您不會出現任何錯誤。該代碼描述了main方法重載的示例
JVM
僅在下面將其識別為main method
。
當JVM啟動類時,將使用public static void main(String [] args){}。
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
的立場可能會發生變化。
名稱main
不是Java編程語言所保留的。 這是一個普通的標識符,因此適用與所有其他標識符相同的規則。 您可以具有多個名為main
方法,只要它們具有不同的參數類型即可。 這就是方法重載 。
某個main
方法的特殊含義由啟動器定義,該啟動器會初始化您的應用程序,而此啟動過程將定義規則。 注意,可能有不同的,特定於實現的啟動應用程序的方式,例如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
方法。 如前所述,它並不關心該名稱的其他方法。
在java中具有正好在下面的簽名的方法:
public static void main(String[] args)
具有特殊權利並考慮了Main方法。 其他只是重載方法。
您在定義簡單方法時,JVM將不會直接調用它們,除非是public static void main(String [] args)。 因此,這取決於您的需求,即您需要一個帶有重載概念的方法,並且該方法是靜態的,因此可以使用類名直接調用它。
據我了解,這僅取決於您的要求。
您可以編寫任意數量的靜態main方法,但是JVM正在尋找特定的main方法簽名 。
public static void main(String[] args)
任何其他主要方法都將存在(並且可以由其他Java元素調用),但是在啟動時JVM將不會調用那些其他主要方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.