簡體   English   中英

具有int,Object和String [] args的Main方法

[英]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的立場可能會發生變化。

JavaDocs

名稱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM