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特性的视频总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正


目录
相关文章
|
11天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
2天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
18 1
|
9天前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
19 1
|
12天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
27 1
|
15天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
17天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
19天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
44 2
|
Java
实践篇-Java命令参数解析
大家我们写的源代码机器是识别不了的,机器只认识机器指令,所以我们的代码要想运行,这中间需要一些转换,因此我们就不得不提到命令这一概念了,用户输入`java`命令,然后对命令进行解析,解析之后给出相应的结果,听起来是不是很酷,很有意思对不对?那就让我带大家来玩一下吧。
643 0
实践篇-Java命令参数解析
|
5天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
4天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
下一篇
无影云桌面