java9新特性--jShell--命令语法改进:try语和接口的私有方法

简介: java9新特性--jShell--命令语法改进:try语和接口的私有方法
  • 模块化系统
  • 语法改进:try语句
  • jShell命令
  • 钻石操作符的使用升级
  • Deprecated的相关API
  • 接口的私有方法
  • javadoc的HTML 5支持
  • String存储结构变更
  • Javascript引擎升级:Nashorn
  • 便利的集合特性:of()
  • java的动态编译器
  • 增强的Stream API
  • 多版本兼容jar包
  • 全新的HTTP客户端API


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外再裹一层,不声明默 认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪些部分可以暴露,哪些部分隐藏

实现目标

  1. 模块化的主要目的在于减少内存的开销
  2. 只须必要模块,而非全部jdk模块,可简化各种类库和大型应用的开 发和维护
  3. 改进 Java SE 平台,使其可以适应不同大小的计算设备
  4. 改进其安全性,可维护性,提高性能

模块

模块将由通常的类和新的模块声明文件(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可以像脚本语言一样运行,

  1. 从控制台启动jShell利用jShell在没有创建类的情况下直接声明变量,计算表达式,
  2. 执行语句。即开发时可以在命令行里直接运行Java的代码,而无需创建Java文件,
  3. 无需跟人解释”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特性的视频总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正


目录
相关文章
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
253 18
|
2月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
228 1
|
2月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
213 4
|
2月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
313 5
|
3月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
154 11
|
存储 并行计算 Java
Java8特性大全(最新版)
Java8特性大全(最新版)
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
189 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
213 1
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
164 0