JShell

JShell目标

Java Shell 工具(简称:JShell)是一个用于学习Java编程语言和构建Java代码原型的交互式工具。JShell是一个Read-Evaluate-Print循环(REPL),它在语法、声明和表达式输入时即对它们进行计算,并立即显示其结果。该 JShell 工具通过命令行来运行。

其实早在 JDK9 中就引入了 JShell 这个交互性工具,让 Java 也可以像脚本语言一样来运行,可以从控制台启动 JShell ,在 JShell 中可以直接输入表达式并查看其运行结果。当需要测试一个方法的运行效果,或是快速的对表达式进行求值时,jshell 都非常实用。

在 JShell 中除了使用表达式之外,还可以创建 Java 类和方法,而且它也有基本的代码完成功能。比如我们在写测试模块的时候,就可以省去多余的 "public static void main(String [] args)" 了。

为什么需要使用 JShell

使用 JShell 工具,我们可以一次输入一个程序元素,立即看到执行结果,并根据需要进行调整。而一个完整的Java应用程序开发步骤通常纷繁复杂,一般流程如下:首先写一个完整的应用程序。

编译该应用程序并修复各种BUG和优化调优等,使其编译通过。

启动运行程序。

上线运行并发现其存在的问题。

编辑应用程序。

重复上面这个过程直至最后的交付。

JShell 则可以帮助我们在开发程序时调试代码并轻松地进行各方面的探索。可以测试单个语句,也可以测试不同的方法体,并在JShell Session 中调试不熟悉的 API。但是 JShell 不能替换 IDE,JShell 只能作辅助或便捷的工具而已。在开发程序的过程中,可以将代码片段粘贴到 JShell Session 中进行试运行,测试通过后,再将 JShell 中的代码片段粘贴回编辑器或IDE中,从而做到快速调试,快速发现问题等,这样一来就节省了不少的开发时间,在一定意义上来讲,就是缩短了程序的开发周期,何乐而不为呢。

JShell的使用

JShell 是在JDK 9中引入的,前面已经提及了,这儿不再重复兹述。要启动 JShell,在命令行中输入命令 " jshell " 即可。前提是必须在本机上安装JDK 9或更高版本。例如java-home/jdk-11/bin,如果您的路径不包含 " bin "目录,则需要从该 bin 目录下启动该工具。以下示例显示了JShell的命令和响应:

C:\Users\HuaZai>jshell

| 欢迎使用 JShell -- 版本 11.0.2

| 要大致了解该版本, 请键入: /help intro

jshell>

要退出 JShell,则输入命令 " /exit " 即可,示例内容如下:

jshell> /exit

| 再见

C:\Users\HuaZai>

JShell 中的代码片段

将Java代码片段输入JShell并立即执行,显示其结果,执行的操作以及发生的任何错误都会立即反馈。使用详细模式启动JShell以获得更多的数据,这儿输入一个简单的语句,变量的声明,示例内容如下:

C:\Users\HuaZai>jshell -v

| 欢迎使用 JShell -- 版本 11.0.2

| 要大致了解该版本, 请键入: /help intro

jshell> int x = 66;

x ==> 66

| 已创建 变量 x : int

jshell>

首先,显示结果。将其读作:变量 x 的值为66,因为目前处于详细模式,所以还会显示所有具体的发生了哪些情况,比如显示已创建变量的名称和类型。

*注意:如果没有输入分号,则JShell会自动将结束分号添加到完整代码段的末尾。

当输入的表达式没有命名变量时,会创建一个临时变量,以便稍后可以引用该值。以下示例显示表达式和方法结果的临时值,示例内容如下:

jshell> 128 + 392

$5 ==> 520

| 已创建暂存变量 $5 : int

jshell> String quintic(String a){

...> return a + a;

...> }

| 已创建 方法 quintic(String)

jshell> quintic("Ts")

$7 ==> "TsTs"

| 已创建暂存变量 $7 : String

jshell>

改变定义内容

在调试代码时,我们可能会发现变量、方法或类的定义没有达到预期的目的。可以通过输入新的定义来轻松更改,新输入的定义将覆盖先前的定义,示例内容如下:

jshell> String quintic(String a){

...> return "Know:" + a;

...> }

| 已修改 方法 quintic(String)

| 更新已覆盖 方法 quintic(String)

jshell> quintic("Base");

$9 ==> "Know:Base"

| 已创建暂存变量 $9 : String

jshell>

请注意,创建方法和以前一样,通过反馈表明修改方法。消息表示定义已更改,但该方法具有相同的方法名,因此所有现有用法仍然有效。

我们还可以以不兼容的方式来更改定义,例如,将 x 从 int 更改为 String 类型的,示例内容如下:

jshell> int x = 66;

x ==> 66

| 已创建 变量 x : int

jshell> String x;

x ==> null

| 已替换 变量 x : String

| 更新已覆盖 变量 x : int

jshell>

JShell 命令

JShell命令在JShell会话中输入,用于控制环境和显示信息。命令与代码段之间的区别是,前面有一个正斜杠(/),有关当前变量、方法和类型的信息,使用 /vars、/methods和 /types命令。获取有关输入的代码片段列表,则使用该/list命令,示例内容如下:

jshell> /vars

| String x = null

| int $3 = 520

| String $5 = "Know:Base"

jshell> /methods

| String quintic(String)

jshell> /list

2 : String x;

3 : 128 + 392

4 : String quintic(String a){

return "Know:" + a;

}

5 : quintic("Base");

jshell>

JShell 还有一个默认的启动脚本,它在 JShell 启动之前以默认的方式自动执行,这样你就可以快速开始工作。除非您使用 /list -start 或 /list -all 命令请求启动脚本中的内容,否则不会列出这些脚本儿内容,示例内容如下:

jshell> /list -all

s1 : import java.io.*;

s2 : import java.math.*;

s3 : import java.net.*;

s4 : import java.nio.file.*;

s5 : import java.util.*;

s6 : import java.util.concurrent.*;

s7 : import java.util.function.*;

s8 : import java.util.prefs.*;

s9 : import java.util.regex.*;

s10 : import java.util.stream.*;

1 : int x = 66;

2 : String x;

3 : 128 + 392

e1 : String quintic(String a){

...> return "Know:" + a;

4 : String quintic(String a){

return "Know:" + a;

}

5 : quintic("Base");

jshell>

JShell 命令的缩写

使用缩写命令的方式,可以减少不必要的内容输入,更主要的是节省时间。命令 /set 子命令,命令参数和命令选项都可以缩写,只要缩写是唯一的即可。例如,/list 命令的开头是 /l ,而 /l 再命令中是唯一的,在其命令选项方面 -all ,而 -a 在其命令选项中是唯一的,所以可以直接将 " /list -all " 缩写为 " /l -a ",示例内容如下:

jshell> /l -a

s1 : import java.io.*;

s2 : import java.math.*;

s3 : import java.net.*;

s4 : import java.nio.file.*;

s5 : import java.util.*;

s6 : import java.util.concurrent.*;

s7 : import java.util.function.*;

s8 : import java.util.prefs.*;

s9 : import java.util.regex.*;

s10 : import java.util.stream.*;

1 : int x = 66;

2 : String x;

3 : 128 + 392

e1 : String quintic(String a){

...> return "Know:" + a;

4 : String quintic(String a){

return "Know:" + a;

}

5 : quintic("Base");

jshell>

JShell 小试牛刀

类的创建于调用,示例内容如下图:

小结

JShell 工具功能非常的强大,除了以上示例内容外,还包括另外的两个强大功能,即:支持外部编辑器编辑、支持外部代码引用。

外部编辑器:JShell 除了支持在 JShell 提示符处编辑输入外,还可以选择外部编辑器进行编辑代码,这个操作是不是很6。通过 Shell 编辑,我们可以在输入时编辑片段和命令,以及检索和更改以前输入的片段和命令。外部编辑器提供了另一种编辑和创建代码段的方法,使用多行代码段时更容易实现。

外部代码引用:在 JShell 会话中,通过类路径的方式访问外部类。可通过模块路径、附加模块设置和模块导出设置的方式来访问外部模块。

java jshelllink_02--Java Jshell的使用 最适合入门的Java教程相关推荐

  1. java语言适合编写什么_01--Java语言概述与开发环境 最适合入门的Java教程

    Java程序运行机制 编译型语言: 使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性"翻译"成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台 ...

  2. java repl_Java REPL – jshell

    java repl Java REPL or jshell is the new tool introduced in java 9. Today we will look into Java REP ...

  3. 适合初学者的java书籍

    学习java技术除了报Java培训班还有自学,书本知识一定不能忘了,书本知识带来的价值更直观,也方便记录,下面小编就为大家详细的介绍一下适合初学者的java书籍. java培训分享适合初学者的java ...

  4. 适合初学者学java技术的书籍推荐!

    想要学会java技术,光靠听课是不够的,看书也是非常重要的一步,以下小编为大家推荐的是适合初学者学java技术的书籍,希望能够给初学者们带来帮助. 适合初学者学java技术的书籍推荐! 1. Java ...

  5. java web开源项目源码_适合Java新手的开源项目集合——在 GitHub 学编程

    作者:HelloGitHub-老荀 当今互联网份额最大的编程语言是哪一个?是 Java!这两年一直有听说 Java 要不行了.在走下坡路了.没错,Java 的确在走下坡路,未来的事情的确不好说,但是瘦 ...

  6. 大学生如何找到适合自己的Java行业

    动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦! 根据动力节点IT培训机构的Java培训学员资料调查显示,在众多的软件培训中,大家选择Java培训的远比其它软件培 ...

  7. java streams_使用JShell的Java 9 Streams API

    java streams 这篇文章着眼于使用JShell的Java 9 Streams API. Streams API的更改以Java 8中Streams的成功为基础,并引入了许多实用程序方法– t ...

  8. 编程入门python java和c语言_学习编程适不适合从Python入门?哪种语言更适合入门?...

    本文对比了C语言和Python语言,分析它们作为编程入门语言各自的利弊,并给出了我推荐的编程学习道路. 我本身已经入门了Python脚本语言,在进阶C语言和JAVA语言后,Python重学就轻松很多, ...

  9. linux入门 适合初学者_经过慎重考虑,我拿出这套适合初学者入门的Java基础完整版视频...

    作为走在编程教育培训前列的黑马程序员,肯定会有很多套教程,有些反响一般,有些却能横空出世,直接成为王牌资源.无可争议的处于我们观看榜.留存榜.好评榜的前列. 对于前期入门,就有几套推出的Java入门视 ...

最新文章

  1. make[1]: g++: Command not found
  2. 仅支持chrome的滚动条样式
  3. mysql5.6安装及实现双向备份
  4. React Native之箭头函数和延展操作符(...)
  5. 产品经理跳槽面试大揭秘……
  6. 28,29_激活函数与GPU加速、Tanh和sigmoid、ReLU、Leaky ReLU、SELU、Softplus、GPU accelerated、案例、argmax
  7. android中的后退功能,如何在Android应用中实现一个返回键功能
  8. 关系数据模型和关系数据库系统
  9. GC:垃圾回收机制及算法
  10. 电大计算机应用小抄,2015年最新电大统考计算机应用基础小抄(完整版电大小抄).DOC...
  11. Mysql优化(出自官方文档) - 第四篇
  12. C语言数字转换为字符的问题
  13. php颜色十六进制代码,如何通过PHP中的十六进制代码检索颜色的人名
  14. linux zen 补丁,Mageia 7.1 发布,修复AMD Zen 2支持
  15. [渝粤教育] 中央财经大学 保险学概论 参考 资料
  16. 纯MSDOS操作系统下的计算机重启与关机
  17. 实习僧[shixiseng.com]爬虫实战笔记
  18. Mysql数据库使用规范
  19. oracle导入提示字符过长,Oracle 解决【ORA-01704:字符串文字太长】
  20. (附源码)小程序 图书管理系统 毕业设计 250858

热门文章

  1. 使用traceview进行Android性能测试(转)
  2. 银行软件业务开发分类杂谈-多年前的旧文
  3. Bailian3719 学生信息用qsort排序【排序+字符串库函数】
  4. 为什么需要学习编程?
  5. HDU2500 做一个正气的杭电人【水题】
  6. NUC1157 To the Max【最大子段和+DP】
  7. Matlab Tricks(二十三)—— 保存图像到 pdf
  8. 排列组合的思考、组合数的推广和拓展
  9. Android WebView重定向问题,Android Webview重定向问题解决方法
  10. JAVA处理模型的步骤,java-处理模型中条件字段的最佳方法