jshell – Java Shell
之前我们研究了Java REPL,即jshell基础。
今天,我们将学习jshell或者java shell的更多功能。
shell
Java 9中引入了jshell或者Java Shell,以帮助开发人员快速运行简短的程序,而无需麻烦地创建类,主方法等。
我们可以简单地在jshell中声明变量,编写语句并执行它们。
我们还可以为当前的jshell会话编译类,然后在下一个语句中使用它。
在本教程中,我们将研究更多jshell功能。
jshell功能
Java Shell或者jshell支持以下功能:
我们可以将其用作评估Java编程语言的声明,语句,表达式等的交互式工具。
我们可以查看先前命令的历史记录。
jshell支持Tab-Completion功能。
Java Shell自动添加分号,因此我们无需显式添加分号。
我们可以根据需要配置默认导入。
我们可以根据需要配置默认定义。
在接下来的部分中,我们将通过一些有用的示例逐一探讨这些功能。
Java Shell算术运算
我们可以在jshell中执行算术运算,如下例所示。
jshell> 10+5 ==> 15 jshell> 10/5 ==> 2 jshell> 10/3 ==> 3 jshell> 10.0/3 ==> 3.3333333333333335 jshell> 10*5 ==> 50 jshell>
如果观察上面的示例,我们会发现在Java Shell中测试算术运算非常容易。
我们可以像简单的数学表达式一样编写它们并获得结果,而无需使用分号。
Java Shell内部变量
如果再次浏览上一节的图像,我们可以清楚地观察到以下代码输出:
jshell> 10+5 ==> 15
jshell在这里分配了一个新的内部变量" $1",以保存" +"算术运算的结果值。
进一步的运算结果也分配给变量$2,$3等。
您可以通过在Java Shell中键入theie名称来访问这些变量值。
我有一个简单的问题要问你。
Java Shell内部变量是final还是Immutable?即我们无法更改其价值?
让我们用一个简单的例子找出来。
jshell> ==> 15 jshell> =20 ==> 20 jshell> System.out.print(" value now = "+) value now = 20 jshell>
因此,这些内部变量是可变的,我们可以更改它们的值,如上面的代码所示。
还要注意,我们可以像其他任何变量一样在java语句中使用这些变量。
jshell制表符完成功能
Java Shell以非常好的方式支持Tab键,以避免键入很多字符并节省开发人员时间。
就像IDE支持一样,可以自动完成变量,函数或者类的名称。
现在让我们通过REPL探索此功能。
只需输入几个字符并按键盘上的" Tab"键,它将为您提供可用的提示来选择。
如果还有更多匹配,它将显示所有匹配,如下所示。
因此,请再输入几个字符以避免冲突。
下图显示了jshell选项卡完成功能示例。
Java Shell导入类型
Java Shell自动导入一些软件包来帮助我们。
我们可以使用/imports命令列出默认情况下导入的所有软件包。
jshell> /imports | import java.io.* | import java.math.* | import java.net.* | import java.nio.file.* | import java.util.* | import java.util.concurrent.* | import java.util.function.* | import java.util.prefs.* | import java.util.regex.* | import java.util.stream.* jshell>
我们可以使用这些包中的任何类,而无需显式导入它们。
这就是为什么我们可以使用Math类而不导入它的原因,如下面的示例所示。
jshell> Math.max(5,10) ==> 10 jshell> Math.min(5,10) ==> 5
但是,如果我们要测试任何其他与包相关的类或者接口,则需要使用外部导入。
否则,我们将得到错误,如下面的代码片段所示:
jshell> ByteBuffer buf = ByteBuffer.allocate(48); | Error: | cannot find symbol | symbol: class ByteBuffer | ByteBuffer buf = ByteBuffer.allocate(48); | ^--------^ | Error: | cannot find symbol | symbol: variable ByteBuffer | ByteBuffer buf = ByteBuffer.allocate(48); | ^--------^ jshell>
我们需要使用如下所示的import语句来导入整个包或者特定的类。
jshell> import java.nio.ByteBuffer jshell> ByteBuffer buf = ByteBuffer.allocate(48); buf ==> java.nio.HeapByteBuffer[pos=0 lim=48 cap=48] jshell>
其中我们能够成功创建一个" ByteBuffer"对象,而不会出现任何问题,因为我们已经手动导入了该类。