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


目录
相关文章
|
4天前
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
12 5
Java——抽象类和接口
|
4天前
|
Java
Java——接口的使用实例
Comparable接口用于自定义类的对象比较。通过实现此接口并重写`compareTo`方法,可以定义自定义类型的比较规则。 接下来介绍了Comparator接口,它提供了一种更灵活的比较方式。通过实现Comparator接口并重写`compare`方法,可以根据不同属性定义不同的比较规则。例如,定义一个`BrandComparator`类来比较汽车的品牌。 最后,介绍了Cloneable接口,用于实现对象的克隆。实现该接口并重写`clone`方法后,可以创建对象的浅拷贝或深拷贝。浅拷贝仅复制对象本身,深拷贝则会递归复制所有成员变量。
12 4
Java——接口的使用实例
|
3天前
|
机器学习/深度学习 人工智能 安全
python和Java的区别以及特性
Python:适合快速开发、易于维护、学习成本低、灵活高效。如果你需要快速上手,写脚本、数据处理、做点机器学习,Python就是你的首选。 Java:适合大型项目、企业级应用,性能要求较高的场景。它类型安全、跨平台能力强,而且有丰富的生态,适合更复杂和规模化的开发。
14 3
|
8天前
|
Java
Java的方法详解
Java的方法是类中的重要组成部分,用于定义类的行为。方法可以接收参数、执行操作并返回结果。其基本语法包括返回类型、方法名、参数列表和方法体。方法支持重载,即同名但参数不同的多个方法;静态方法则直接通过类名调用,无需实例化。此外,Java还支持可变参数,允许方法接收不定数量的参数。通过访问修饰符如`public`、`protected`、`private`,可以控制方法的可见性。方法是实现类功能的基本单元,增强了程序的灵活性和复用性。
|
8天前
|
Java 开发者
Java的接口详解
Java接口是编程中的一种重要特性,用于定义方法签名而不提供具体实现,作为类之间的契约,使不同类能以统一方式交互。接口使用`interface`关键字定义,可包含方法声明和常量。类通过`implements`关键字实现接口,并可同时实现多个接口,解决多重继承问题。接口中的方法默认为抽象方法,变量默认为`public static final`。Java 8引入了默认方法和静态方法,增强接口功能。接口广泛应用于回调机制和多态性实现,有助于构建更灵活和可维护的代码结构。
|
6天前
|
JavaScript 前端开发 Java
通过JUnit5访问Java静态、私有、保护变量和方法
在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
12 0
|
IDE Java 关系型数据库
Java14发布,16大新特性,代码更加简洁明快
Java14发布,16大新特性,代码更加简洁明快
308 0
Java14发布,16大新特性,代码更加简洁明快
|
5天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
16天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
75 6
【Java学习】多线程&JUC万字超详解
|
1天前
|
Java
深入理解Java中的多线程编程
本文将探讨Java多线程编程的核心概念和技术,包括线程的创建与管理、同步机制以及并发工具类的应用。我们将通过实例分析,帮助读者更好地理解和应用Java多线程编程,提高程序的性能和响应能力。
13 4