注意,你不必使用完整限定类名(FQCN)来引用ArrayList,也不必import java.util包。这是因为,在默认情况下,JShell启动时会自动执行一些预定义导入,减少导入常用包或输入FQCN的麻烦。
下面是默认导入的包:
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.*
正如你所料,你也可以根据需要输入import <pkg_name>定义自己的导入,其中<pkg_name>是类路径上一个有效的软件包。
方法现在,让我们定义一个方法getRandomAudience,用于随机选取一名听众。该方法接收一个听众列表(List<String>),随机返回列表中的一名听众。你可以直接在命令行中定义方法,就像你在类中定义方法一样,不过,你不需要定义一个类!
jshell> public String getRandomAudience(List<String> audiences) { ...> return audiences.get(new Random().nextInt(audiences.size())); ...> } | created method getRandomAudience(List<String>)如果一切顺利,JShell会显示方法已经成功创建,可以使用了。
让我们尝试调用这个方法,并传递听众列表。多调用几次,确保每次获得不同的结果。
jshell> getRandomAudience(audiences) $7 ==> "world" jshell> getRandomAudience(audiences) $8 ==> "universe" jshell> getRandomAudience(audiences) $9 ==> "galaxy"这里有一件很有趣的事需要注意,在方法体中,你可以引用之前定义的任何变量和尚未定义的变量(稍后会详细介绍)。
让我们创建getRandomAudience方法的另外一个版本,它不接收参数,直接在方法体内使用我们的听众列表。
jshell> public String getRandomAudience() { ...> return audiences.get(new Random().nextInt(audiences.size())); ...> } | created method getRandomAudience()再次执行几遍。
jshell> getRandomAudience() $10 ==> "galaxy" jshell> getRandomAudience() $11 ==> "world" jshell> getRandomAudience() $12 ==> "galaxy"我上面提到过,方法还可以使用尚未定义的变量。让我们定义一个名为getSeparator的新方法,返回一个可以用来分隔单词的值。不过,这一次,我们将使用一个未定义的变量wordSeparator。
jshell> public String getSeparator() { ...> return wordSeparator; ...> } | created method getSeparator(), however, it cannot be invoked until variable wordSeparator is declared注意,JShell创建了getSeparator方法, 但告诉我们,在我们声明或定义wordSeparator变量之前,该方法不能使用。任何调用它的尝试都会产生一条类似的错误信息。
jshell> getSeparator() | attempted to call method getSeparator() which cannot be invoked until variable wordSeparator is declared把变量wordSeparator简单地定义成一个空格,再次尝试调用它。
jshell> var wordSeparator = " " wordSeparator ==> " " jshell> getSeparator() $13 ==> " "