|
|
|
|
|
|
|
|
|
|
|
|
|
|
JDK 和 JRE 目录结构的改变
bin 目录 | 包含命令行开发和调试工具,如javac,jar和javadoc。 |
include目录 | 包含在编译本地代码时使用的C/C++头文件 |
lib 目录 | 包含JDK工具的几个JAR和其他类型的文件。 它有一个tools.jar文件,其中包 含javac编译器的Java类 |
jre/bin 目录 | 包含基本命令,如java命令。 在Windows平台上,它包含系统的运行时动态链 接库(DLL)。 |
jre/lib 目录 | 包含用户可编辑的配置文件,如.properties和.policy文件。包含几个JAR。 rt.jar文件包含运行时的Java类和资源文件。 |
没有名为jre的子目录 |
|
bin 目录 |
目录 包含所有命令。 在Windows平台上,它继续包含系统的运行时动态链接库。 |
conf 目录 | 目录 包含用户可编辑的配置文件,例如以前位于jre\lib目录中的.properties和.policy文件 |
include 目录 | 包含要在以前编译本地代码时使用的C/C++头文件。 它只存在于JDK中 |
jmods 目录 | 包含JMOD格式的平台模块。 创建自定义运行时映像时需要它。 它只存在于JDK中 |
legal 目录 | 包含法律声明 |
lib 目录 | 包含非Windows平台上的动态链接本地库。 其子目录和文件不应由开发人员直接编辑或使用 |
显示详细信息
模块化系统: Jigsaw -> Modularity
谈到 Java 9 大家往往第一个想到的就是 Jigsaw 项目。众所周知,Java 已经 发展超过 20 年(95 年最初发布),Java 和相关生态在不断丰富的同时也越 来越暴露出一些问题:
Java 运行环境的膨胀和臃肿。每次JVM启动的时候,至少会有30~60MB的内存 加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第 一步整个jar都会被JVM加载到内存当中去(而模块化可以根据模块的需要加载程 序运行需要的class)
当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。不同版本的类库交叉依赖导致让人头疼的问题,这些都阻碍了 Java 开发和 运行效率的提升。
很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间 的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到,这样就会导致无意中使用了并不想被公开访问的 API。
本质上讲也就是说,用模块来管理各个package,通过声明某个package 暴露,
模块(module)的概念,其实就是package外再裹一层,不声明默 认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪些部分可以暴露,哪些部分隐藏。
实现目标
- 模块化的主要目的在于减少内存的开销
- 只须必要模块,而非全部jdk模块,可简化各种类库和大型应用的开 发和维护
- 改进 Java SE 平台,使其可以适应不同大小的计算设备
- 改进其安全性,可维护性,提高性能
模块
模块将由通常的类和新的模块声明文件(module-info.java)组成。
该文件是位于 java代码结构的顶层,该模块描述符明确地定义了
我们的模块需要什么依赖关系, 以及哪些模块被外部使用。在exports子句中未提及的所有包默认情况下将封装在 模块中,不能在外部使用。
结构
要想在java9demo模块中调用java9test模块下包中的结构,需要在java9test 的module-info.java中声明:
/** * @author songhongkang * @create 2019 下午 11:57 */ module java9test { //package we export exports com.atguigui.bean; }
exports:控制着哪些包可以被其它模块访问到。所有不被导出的包默认 都被封装在模块里面。
对应在java 9demo 模块的src 下创建module-info.java文件:
/** * @author songhongkang * @create 2019 下午 11:51 */ module java9demo { requires java9test; }
requires:指明对其它模块的依赖。
jShell命令
产生背景
像Python 和 Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print - loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,
就可以在编译前获得对程序的反馈。而之前的Java版本要想执行代码,
必须创建文 件、声明类、提供测试方法方可实现。
设计理念
即写即得、快速运行
实现目标
Java 9 中终于拥有了 REPL工具:jShell。让Java可以像脚本语言一样运行,
- 从控制台启动jShell利用jShell在没有创建类的情况下直接声明变量,计算表达式,
- 执行语句。即开发时可以在命令行里直接运行Java的代码,而无需创建Java文件,
- 无需跟人解释”public static void main(String[] args)”这句废话。
jShell也可以从文件中加载语句或者将语句保存到文件中。
jShell也可以是tab键进行自动补全和自动添加分号。
jShell命令
调出jShell 导入指定的包
获取帮助
基本使用 默认已经导入如下的所有包:(包含java.lang包)
Tips:在 JShell 环境下,语句末尾的“;” 是可 选的。但推荐还是最好加上。提高代码可读性。
只需按下 Tab 键,就能自动补全代码
列出当前 session 里所有有效的代码片段
查看当前 session 下所有创建过的变量
查看当前 session 下所有创建过的方法
Tips:我们还可以重新定义相同方法名和参 数列表的方法,即为对现有方法的修改(或 覆盖)。
使用外部代码编辑器来编写 Java 代码
使用/open命令调用:
没有受检异常(编译时异常)
说明:本来应该强迫我们捕获一个IOException,但却没有出现。因为jShell在 后台为我们隐藏了。
退出jShell
语法改进:接口的私有方法
Java 8中规定接口中的方法除了抽象方法之外,还可以定义静态方法 和默认的方法。一定程度上,扩展了接口的功能,此时的接口更像是 一个抽象类。
在Java 9中,接口更加的灵活和强大,连方法的访问权限修饰符都可 以声明为private的了,此时方法将不会成为你对外暴露的API的一部分。
interface MyInterface { void normalInterfaceMethod(); default void methodDefault1() { init(); } public default void methodDefault2() { init(); } // This method is not part of the public API exposed by MyInterface private void init() { System.out.println("默认方法中的通用操作"); } } class MyInterfaceImpl implements MyInterface { @Override public void normalInterfaceMethod() { System.out.println("实现接口的方法"); } } public class MyInterfaceTest { public static void main(String[] args) { MyInterfaceImpl impl = new MyInterfaceImpl(); impl.methodDefault1(); // impl.init();//不能调用 } }
语法改进:钻石操作符使用升级
我们将能够与匿名实现类共同使用钻石操作符(diamond operator)在Java 8 中如下的操作是会报错的:
Comparatorcom = new Comparator<>(){
@Override public int compare(Object o1, Object o2) {
return 0;
}
};
编译报错信息:Cannot use “<>” with anonymous inner classes.
Java 9中如下操作可以正常执行通过:
Comparatorcom = new Comparator<>(){
@Override public int compare(Object o1, Object o2) {
return 0;
}
};
语法改进:try语句
Java 8 中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必 须在try子句中初始化,否则编译不通过。如下例所示:
try(InputStreamReader reader = new InputStreamReader(System.in)){ //读取数据细节省略 }catch (IOException e){ e.printStackTrace(); }
Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始化过的资源,此时的资源是final的:
InputStreamReader reader = new InputStreamReader(System.in); OutputStreamWriter writer = new OutputStreamWriter(System.out); try (reader; writer) { //reader是final的,不可再被赋值 //reader = null; //具体读写操作省略 } catch (IOException e) { e.printStackTrace(); }
本章笔记是观看尚硅谷的java9特性的视频总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正