JDK11 | 第五篇 : 启动单个Java源代码文件的程序
文章首发于公众号《程序员果果》
一、简介
JEP330-启动单文件代码程序(Launch Single-File Source-Code Programs),是JDK11中一个很不错的功能。这个功能允许你直接使用java解析器运行java代码,java文件会在内存中执行编译并且直接执行。唯一的约束在于所有相关的类必须定义在东一个java文件中。
二、实例
案例1
创建一个 Test.java 文件 ,代码如下:
public class Test { public static void main(String[] args) { System.out.println("Test ..."); } }
执行上面的代码
jdk11之前 :
javac Test.java java Test
jdk11:
java Test.java
结论:jdk11中,通过 java xxx.java 命令,就可直接运行源码文件程序,而且不会产生.class 文件。
案例2
问题:如果一个java文件中存在多个类 ,通过 java xxx.java 运行源码文件,会执行哪一个main方法 ?
创建一个 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方法。
案例3
问题:如果一个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文件中。
三、结论
通过上面的三个案例,我得出以下结论:
- jdk11中,通过 java xxx.java 命令,就可直接运行源码文件程序,而且不会产生.class 文件。
- 一个java文件中包含多个类时,java xxx.java 执行排在最上面的一个类的main方法。
- java xxx.java 启动单个Java源代码文件的程序时,相关个类必须定义在同一个java文件中。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JDK11 | 第四篇 : 增强API
文章首发于公众号《程序员果果》 地址 : https://mp.weixin.qq.com/s/O0xntC-JfeSBk-9x2QfwnA 一、简介 JDK 9~11 在语言语法方面有一个小改动,增加了相当数量的新API,这一节讲解下JDK1.8之后新增的一些API。 二、增强API 1. 集合的增强api 自Java 9开始,Jdk里面为集合(List / Set / Map)都添加了of和copyOf方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。 /** * List的增强api */ @Test public void test1() { List<String> list = List.of( "aa", "bb", "cc", "dd" ); System.out.println( list ); // 抛出java.lang.UnsupportedOperationException 异常 list.add( "ee" ); System.out.println( list ); } /** * Set的增强api */ @Test publi...
- 下一篇
JDK11 | 第六篇 : Epsilon 垃圾收集器
文章首发于公众号《程序员果果》 地址 : https://mp.weixin.qq.com/s/RhGXJImhp7Xm-wDrpPomkQ 一、简介 Epsilon(A No-Op Garbage Collector)垃圾回收器控制内存分配,但是不执行任何垃圾回收工作。一旦java的堆被耗尽,jvm就直接关闭。设计的目的是提供一个完全消极的GC实现,分配有限的内存分配,最大限度降低消费内存占用量和内存吞吐时的延迟时间。一个好的实现是隔离代码变化,不影响其他GC,最小限度的改变其他的JVM代码。 二、使用场景 Performance testing,什么都不执行的GC非常适合用于差异性分析。no-op GC可以用于过滤掉GC诱发的新能损耗,比如GC线程的调度,GC屏障的消耗,GC周期的不合适触发,内存位置变化等。此外有些延迟者不是由于GC引起的,比如scheduling hiccups, compiler transition hiccups,所以去除GC引发的延迟有助于统计这些延迟。 Memory pressure testing, 在测试java代码时,确定分配内存的阈值有助于设置...
相关文章
文章评论
共有0条评论来说两句吧...