02--Java Jshell的使用 最适合入门的Java教程
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 会话中,通过类路径的方式访问外部类。可通过模块路径、附加模块设置和模块导出设置的方式来访问外部模块。
02--Java Jshell的使用 最适合入门的Java教程的更多相关文章
- 01--Java语言概述与开发环境 最适合入门的Java教程
Java 程序运行机制 编译型语言: 使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性"翻 译"成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该 ...
- 最适合新手入门的SpringCloud教程 6—Ribbon负载均衡「F版本」
SpringCloud版本:Finchley.SR2 SpringBoot版本:2.0.3.RELEASE 源码地址:https://gitee.com/bingqilinpeishenme/Java ...
- 070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据
070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据 本文知识点:综合案例-数组移位-从键盘接收数据 说明:因为时间紧张 ...
- 064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法
064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法 本文知识点:无参带返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...
- 055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念
055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念 本文知识点:数组的概念 数组的声明创建.初始化 在学习数组的声明创建.初始化前,我们可以和之 ...
- 040 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 02 while循环的执行流程
040 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 02 while循环的执行流程 本文知识点:while循环的执行流程 三种循环结构中的第一种--wh ...
- 035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构
035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构 本文知识点:Java中的多重if结构 选择结构回顾 if选择结构 注意: 1.条 ...
- 022 01 Android 零基础入门 01 Java基础语法 03 Java运算符 02 算术运算符
022 01 Android 零基础入门 01 Java基础语法 03 Java运算符 02 算术运算符 本文知识点:Java中的算术运算符 算术运算符介绍 算术运算符代码示例 注意字符串连接问题和整 ...
- 020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结
020 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 14 变量与常量 知识总结 本文知识点:变量与常量 知识总结 Java中的标识符 Java中的关键字 目前常 ...
随机推荐
- redis实现网关限流(限制API调用次数1000次/分)
添加maven依赖,使用springboot2.x版本 <dependency> <groupId>org.springframework.boot</groupId&g ...
- filebeat的@timestamp字段时区问题
最近使用filebeat进行日志采集,并通过logstash对日志进行格式化处理. filebeat采集数据后,会给日志增加字段@timestamp,@timestamp是UTC时间,查看日志很不方便 ...
- Zuhair and Strings-祖海和字符串 CodeForce#1105B
题目链接:Zuhair and Strings 题目原文 Given a string
- 要不要学习Git(分布式版本控制系统)
做技术的人,要不要学一学Git呢? 提出这个问题,是因为很多小伙伴还不会使用Git. 对于任何新一代的技术工具,它在业界普及都有一个过程,Git的阻碍是:学习成本.工具迭代的成本. SVN诞生于200 ...
- Spring boot 官网学习笔记 - 开发第一个Spring boot web应用程序(使用mvn执行、使用jar执行)
Creating the POM <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- Spring 梳理-容器(container)
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的.一开始,Spring用XML配置,而且是很多XML配置.Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显 ...
- Linux 安装CentOS7操作系统
作者:小啊博 QQ:762641008 转载请声明:https://www.cnblogs.com/-bobo 1.安装操作系统 开启虚拟机后会出现以下界面 Install CentOS 7 安装Ce ...
- AVR单片机教程——EasyElectronics Library v1.1手册
索引: bit.h delay.h pin.h wave.h pwm.h led.h rgbw.h button.h switch.h 主要更新: 用枚举类型替换了大部分宏定义: 添加了wave.h. ...
- 【转】ICMP协议
1.ICMP出现的原因 在IP通信中,经常有数据包到达不了对方的情况.原因是,在通信途中的某处的一个路由器由于不能处理所有的数据包,就将数据包一个一个丢弃了.或者,虽然到达了对方,但是由于搞错了端口号 ...
- 记录 java 安卓 各类引用包报错处理方法 例如 android.support.v4.app.+ ,io.reactivex.+
可能导致的原因: 1. 引用包不存在(存在也报错就是 版本不对) 2.有资源文件 重名,报错之类的问题 3. 别人提交了资源文件或者配置文件(这是最常见的,特别是新手,我也是),后续遇到再加 解决方法 ...