文章首發於公衆號《程序員果果》java
JEP330-啓動單文件代碼程序(Launch Single-File Source-Code Programs),是JDK11中一個很不錯的功能。這個功能容許你直接使用java解析器運行java代碼,java文件會在內存中執行編譯而且直接執行。惟一的約束在於全部相關的類必須定義在東一個java文件中。shell
建立一個 Test.java 文件 ,代碼以下:微信
public class Test { public static void main(String[] args) { System.out.println("Test ..."); } }
執行上面的代碼this
jdk11以前 :code
javac Test.java java Test
jdk11:blog
java Test.java
結論:jdk11中,經過 java xxx.java 命令,就可直接運行源碼文件程序,並且不會產生.class 文件。內存
問題:若是一個java文件中存在多個類 ,經過 java xxx.java 運行源碼文件,會執行哪個main方法 ?get
建立一個 Test1.java 文件,代碼以下:源碼
class Test2 { public static void main(String[] args) { System.out.println("Test2"); } } public class Test { public static void main(String[] args) { System.out.println("Test"); } }
經過 java Test.java 運行後輸出 "Test2"。
下面咱們顛倒 Test Test2 兩個類的位置:
public class Test { public static void main(String[] args) { System.out.println("Test"); } } class Test2 { public static void main(String[] args) { System.out.println("Test2"); } }
經過 java Test.java 運行後輸出 "Test"。
結論:一個java文件中包含多個類時,java xxx.java 執行排在最上面的一個類的main方法。
問題:若是一個java文件中類的方法中調用了另外一個java文件中類的方法,經過 java xxx.java 運行源碼文件,能運行經過嗎 ?
建立兩個java文件 Student.java 、Teacher.java。
Student.java:
public class Student { public static void main(String[] args) { Teacher teacher = new Teacher(); teacher.toString(); } }
Student.java:
public class Teacher { private String name; private String subject; public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setSubject(String subject){ this.subject = subject; } public String getSubject(){ return subject; } }
執行 java Student.java 報錯 :
Student.java:4: 錯誤: 找不到符號 Teacher teacher = new Teacher(); ^ 符號: 類 Teacher 位置: 類 Student Student.java:4: 錯誤: 找不到符號 Teacher teacher = new Teacher(); ^ 符號: 類 Teacher 位置: 類 Student 2 個錯誤
把 Student 和 Teacher 連個類 放在一個java文件中 ,從新運行,運行經過。
結論:java xxx.java 啓動單個Java源代碼文件的程序時,相關個類必須定義在同一個java文件中。
經過上面的三個案例,我得出如下結論:
歡迎掃碼或微信搜索公衆號《程序員果果》關注我,更多精彩內容不能錯過 ~~
(轉載本站文章請註明做者和出處 程序員果果的博客)