1.1.4 JShell
在1.1.2小节中,你看到了如何编译和运行一个Java程序。JShell程序提供了一个“读取—评估—打印循环”(read-evaluate-print loop,REPL)的方式,它允许你尝试Java代码而无须编译和运行程序。当输入Java表达式时,JShell会评估输入,并打印结果,然后等待下一次输入。如果要启动JShell,只须在终端窗口中输入jshell,如图1-3所示。
图1-3 运行JShell
JShell以问候语开头,然后显示提示符:
| Welcome to JShell -- Version 17 | For an introduction type: /help intro jshell>
现在可以输入一个Java表达式,例如:
"Hello, World!".length()
JShell会给你一个反馈,表示运行结果和下一个提示符:
$1 ==> 13 jshell>
需要注意的是,你并没有输入System.out.println。JShell会自动打印输入的每个表达式的值。
输出中的$1表示该结果可用于进一步的计算。例如,如果继续输入:
3 * $1 + 3
则JShell的反馈为:
$2 ==> 42
如果需要多次使用一个变量,那么可以给它指定一个更加容易记忆的名字。一定要遵循Java语法,同时指定类型和变量名(参见1.3节)。例如:
jshell> int answer = 42 answer ==> 42
可以让JShell替你填写类型。具体操作是,输入一个表达式,不要按Enter键,而是按住Shift+Tab组合键,然后按V键。例如,当输入:
new Random()
然后按Shift + Tab组合键和V键,你会看到:
jshell> Random = new Random()
这时的光标位于 = 符号之前。此时可以输入一个变量名,然后按Enter键:
jshell> Random generator = new Random() generator ==> java.util.Random@3fee9989
此外,还有一个很棒的功能是Tab补全功能,例如输入:
generator.
随后按Tab键,你将会得到一个可以在generator变量上调用的所有方法的列表:
jshell > generator. doubles( equals( getClass() hashCode() ints( isDeprecated() longs( nextBoolean() nextBytes( nextDouble( nextExponential() nextFloat( nextGaussian( nextInt( nextLong( notify() notifyAll() setSeed( toString() wait(
现在输入ne再按Tab键。方法名会补全为next,并且你会得到一个更加简短的列表:
jshell> gengerator.next nextBoolean() nextBytes( nextDouble( nextExponential() nextFloat( nextGaussian( nextInt( nextLong(
如果再按D键和Tab键,方法名会自动补全为nextDouble(。再次按Tab键,将会看见3个备选:
Signatures: double java.util.random.RandomGenerator.nextDouble(double bound) double java.util.random.RandomGenerator.nextDouble(double origin, double bound) double Random.nextDouble() <press tab again to see documentation>
按)键可以选择第3个版本:
jshell> gengerator.nextDouble() $3 ==> 0.9560346568377398
注意:在自动完成列表中,需要参数的方法只能后跟左括号,如nextDouble( ,而不需要参数的方法有一对完整括号,如nextBoolean()。
如果要重复运行命令,可以按 ↑ 键,直到看到要重新运行或编辑的行。可以用 ← 键和 → 键移动命令行中的光标,并添加或删除字符,完成后按Enter键。例如,按 ↑ 键并用Int替换Double,然后按Enter键:
jshell> generator.nextInt() $4 ==> -352355569
默认情况下,JShell将会导入以下包:
java.io java.math java.net java.nio.file java.util java.util.concurrent java.util.function java.util.prefs java.util.regex java.util.stream
这就是可以在JShell中使用Random类而不需要任何导入语句的原因。如果需要导入其他类,可以在JShell提示符下输入导入语句。或者,更方便的是,通过按住Shift+Tab组合键和I键,可以让JShell搜索它。例如,输入Duration,然后按住Shift+Tab组合键和I键,你将获得一个潜在操作的列表:
jshell> Duration 0: Do nothing 1: import: java.time.Duration 2: import: javafx.util.Duration 3: import: javax.xml.datatype.Duration Choice:
输入1,然后你将收到一个确认信息:
Imported: java.time.Duration
随后显示:
jshell> Duration
这样就完成了导入工作,然后就可以继续工作了。这些命令足以让你开始使用 JShell。要获得更加详细的帮助,输入/help并按Enter键。如果要退出JShell环境,输入/exit并按Enter键,或者只须按Ctrl+D组合键。
JShell 使得 Java 语言和相关库的学习变得轻松而有趣,且无须启用庞大的开发环境和编写复杂的public static void main等代码。