java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9。jdk9和jdk8中的新特性不同:jdk8中的stream和lambda表达式能够让开发者非常快速和直观地感受到新版本的功能特性,而java9中的关键更新——模块化,相比而言不能让开发者有直观的感受。

今天首先带来的是java9中直观的新特性:JShell。关于更多jdk9特性的介绍可以参照infoq的一篇文章:https://mp.weixin.qq.com/s/Onj9ZJYbV5pLTAPcYBJREA

更多JDK9中的新特性说明,请参照:https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6

JShell目标

JShell的目标是提供一个交互工具,通过它来运行和计算java中的表达式。开发者可以轻松地与JShell交互,其中包括:编辑历史,tab键代码补全,自动添加分号,可配置的imports和definitions。其他的很多主流编程语言如python都已经提供了console,便于编写一些简单的代码用于测试。值得一提的是,JShell并不是提供了新的一个交互语言,在JShell中编写的所有代码都必须符合java语言规范;图形界面和调试支持也没有,JShell的一个目标是可以在IDE中使用JShell交互,而不是实现IDE实现的功能。

每一门编程语言的第一个练习就是打印“Hello,World”,有了JShell之后,Java开发者终于不用先编写一个类,再编写“奇怪的”main方法,相信对于初学者来说是一个福音。

JShell的使用

安装jdk9并配置环境变量后,就可以在控制台中使用JShell了,JShell在Java安装目录的/bin目录下:

更多的命令可以使用/help来查看,例如:

/exit:退出JShell

/list:查看已经输出的表达式

值得一提的是:使用tab键激活代码提示,再次使用tab键查看函数的文档,不必在表达式的结尾使用";",JShell会自动给表达式添加分号。

JShell说明

功能

输入的代码作为代码片段(snippets),代码片段需要符合java语法规则:

  • Expression

  • Statement

  • ClassDeclaration

  • InterfaceDeclaration

  • MethodDeclaration

  • FieldDeclaration

  • ImportDeclaration

例如,可以再JShell中初始化变量:


int a = 42;

也可以定义类:

public class C{
public void fun(){
System.out.println("function");
}
}

规则

所有的代码片段(如类定义、方法定义)都有一个名称与之关联,并且别的代码块可以通过这个名称来引用它。定义的代码片段遵循以下规则:

  • 访问控制修饰(private/protected/public)将被忽略。所有定义的代码片段都能被其他的代码片段访问。

  • final修饰符被忽略。

  • static修饰符被忽略,因为没有用户可见的包含静态方法的类,这些包装都由JShell来做。

  • 不允许使用default和synchronized修饰符。

  • abstract修饰符仅仅允许用于修饰类。

很多代码片段都包含嵌套定义,例如在类中定义成员变量和成员方法。在成员函数中定义的函数使用的访问控制符是有效的。也就是说 ,如果在类C中定义方法private void fun(),在别的代码片段中是无法通过new C().fun()来访问的。

前向引用(Forward reference)

在Java的类中,可以会使用后续代码中定义的方法,这在JShell中也是可以的(举例来说,可以再方法a()中调用后面定义的方法b())。但是变量的初始化不支持前向引用。

模块化环境配置

模块化环境可以配置和直接添加到编译和运行选项中。编译选项使用-C,运行选项使用-R。关于Jigsaw和模块化相关的新特性,后续再来细说。

总结

JShell提供了一个控制台交互界面,通过这个交互界面,开发者可以快速编写代码片段并运行,可以查看类库的文档,可以编写简单的程序。在需要快速验证的场景,我们不再需要先定义类、再定义方法、再定义main()方法或单元测试来验证我们的想法;对于java初学者来说,这也提供了一个简便的方法来学习java,是一个简单而又实用的特性。

JShell相关文档

The JShell module API Specifications can found here:

Which includes the primary JShell API (jdk.jshell package) Specification:

The jshell tool reference:

is part of the Java Platform, Standard Edition Tools Reference:

Java9新特性之——JShell的更多相关文章

  1. Java9 新特性 详解

    作者:木九天   <   Java9 新特性 详解  > Java9 新特性 详解 摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方 ...

  2. 【Java基础】Java9 新特性

    Java9 新特性 模块化系统 Java 和相关生态在不断丰富的同时也越来越暴露出一些问题: Java 运行环境的膨胀和臃肿.每次 JVM 启动的时候,至少会 30-60MB 的内存加载,主要原因是 ...

  3. 点击--》java9 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

  4. 传统JIT和java9新特性AOT理解

    java慢的原因 1.  除了少量基本类型用栈存储外,所有对象都使用堆存储.堆的性能低于栈. 2.  很多强制类型转换(cast)或加查,耗用内存大.java运行时对类型检测,如果类型不正确会抛出Cl ...

  5. JAVA9新特性——JShell使用笔记

    前言:JShell是java 9的新特性之一,由于在之前学校java8的lambda表达式的时候,就希望有这么一个可以交互的界面来快速响应编写的代码.刚好java9出来了,就对它把玩起来了... 内容 ...

  6. Java9 新特性

    Java9中的9个新特性 1. Java 平台级模块系统 2. Linking 3. JShell: 交互式 Java REPL 4. 改进的 Javadoc 5. 集合工厂方法 6. 改进的 Str ...

  7. Java9新特性

    转载:http://blog.csdn.net/qq_32524177/article/details/77014757 写在前面的话:Java9来了,搜索了很多关于Java9的新特性,但文献不多,特 ...

  8. java9新特性-6-多版本兼容jar包

    1.官方Feature 238: Multi-Release JAR Files 2.使用说明 当一个新版本的Java出现的时候,你的库用户要花费数年时间才会切换到这个新的版本.这就意味着库得去向后兼 ...

  9. java9新特性-1-概述

    经过4次跳票,历经曲折的java 9 终于终于在2017年9月21日发布.       2.哪些人适合看这套视频? 已经熟悉或熟练运用java 8 及 之前 java 版本的开发人员.科研人员.学生及 ...

随机推荐

  1. 优秀的PE工具收藏

    优秀的PE工具收藏... ----------------------- ------------------------------------------<排名不分先后..自己喜欢的就是最好 ...

  2. Spring Data Jpa(Hibernate) OneToMany

    这个其实非常简单.假设有topic 和 subscriber两个实体类,不考虑关联关系,则连个类的代码如下: /** * Created by csonezp on 2017/8/31. */ @En ...

  3. python中列表 元组 字典 集合的区别

    列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计 ...

  4. (转载)理解Java中的引用传递和值传递

      关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...

  5. java中super关键字

    1.子类的构造函数如果要引用super的话,必须把super放在函数的首位,如果想用super继承父类构造的方法,但是没有放在第一行的话,那么在super之前的语句,肯定是为了满足自己想要完成某些行为 ...

  6. hdu 2066 最短路水题

    题意:给出多个可选择的起始点和终点,求最短路 思路:执行起始点次的spfa即可 代码: #include<iostream> #include<cstdio> #include ...

  7. linux c编程:初识进程与线程

    p { margin-bottom: 0.25cm; line-height: 120% } (一) 认识进程 在Linux系统中,每一个进程都有自己的ID,就如同人的身份证一样.linux中有一个数 ...

  8. NHibernate教程(11)--多对多关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  9. 将home多余的空间分配到"/"分区下

    一.操作过程 1.df -h 查看分区大小情况; [root@localhost /]# df -h Filesystem            Size  Used Avail Use% Mount ...

  10. 【Beta阶段】测试与发布

    [Beta阶段]测试报告 一.Bug记录 1. 已经修复的BUG:文件查重的小组的空指针处理了 . 2.未能修复的bug: (1).在进行查重的时候必要要有10个文件,不然会报错:        (2 ...