Java核心技术速学版(第3版)
上QQ阅读APP看书,第一时间看更新

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等代码。