JShell 入门第 2 部分
前言
在本系列的第一篇指南中,您了解了什么是 JShell 以及如何安装它。
在本指南中,您将学习如何开始使用 Jshell。
表达式和变量
因此,让我们从一个简单的表达式开始:
jshell> "Hello World"
$1 ==> "Hello World"
请注意,计算结果已显示,并已分配给名为$1 的变量。您可以通过输入变量名称来检查这一点:
jshell> $1
$1 ==> "Hello World"
当表达式的结果未分配给某个变量时,将隐式创建此类变量。如果表达式没有返回值(如 print 语句),则不会创建任何变量。
您可以像使用其他任何变量一样使用这个隐式变量:
jshell> System.out.println($1)
Hello World
您还可以更改其持有的值:
jshell> $1 = $1 + " again"
$1 ==> "Hello World again"
jshell> System.out.println($1)
Hello World again
不过,使用一些有意义的标识符可能会更好:
jshell> String hello = $1
hello ==> "Hello World again"
jshell> System.out.println(hello)
Hello World again
从前面的例子可以看出,单个语句不需要使用分号。当然,如果你尝试同时执行多个语句,这将不起作用:
jshell> int sum = 1 + 2 System.out.println(sum)
| Error:
| ';' expected
| int sum = 1 + 2 System.out.println(sum);
| ^
语句之间需要一个分号(但如果不需要,可以不用在最后一个语句之后):
jshell> int sum = 1 + 2; System.out.println(sum)
sum ==> 3
3
此外,JShell 不会执行语句,除非它知道该语句已完成。例如,如果你只输入if(sum > 0),提示符将更改为...>:
jshell> if(sum >0)
...>
系统将提示我们继续输入代码片段,直到完成有效的语句或块:
jshell> if(sum > 0)
...> System.out.print(sum)
3
方法
键入多行语句的能力使我们能够编写完整的方法和类。例如,您可以定义一个方法来返回参数的负值:
jshell> int getNegativeValue(int number) {
...> return -number;
...> }
| created method getNegativeValue(int)
这样,你就可以像这样调用它:
jshell> getNegativeValue(10)
$5 ==> -10
引用
有时,方法会引用稍后在类中定义的变量或其他方法。这些被称为前向引用。由于在 JShell 中,代码是按顺序输入和评估的,因此使用前向引用的代码只有在评估这些引用后才能调用。以以下方法声明为例:
jshell> int addMagicNumber(int number) {
...> return number + MAGIC_NUMBER;
...> }
| created method addMagicNumber(int), however, it cannot be invoked until variable MAGIC_NUMBER is declared
在定义MAGIC_NUMBER之前,您将无法使用它:
jshell> System.out.println(addMagicNumber(3))
| attempted to call method addMagicNumber(int) which cannot be invoked until variable MAGIC_NUMBER is declared
jshell> int MAGIC_NUMBER = 1
MAGIC_NUMBER ==> 1
jshell> System.out.println(addMagicNumber(3))
4
JShell 支持以下前向引用:
- 方法
- 类型
- Return 语句
- 参数
- 变量
但是,它不支持变量初始化器中的前向引用(可能是因为它们需要在定义变量时执行):
jshell> int MAGIC_NUMBER = getMagicNumber()
| Error:
| cannot find symbol
| symbol: method getMagicNumber()
| int MAGIC_NUMBER = getMagicNumber();
| ^------------^
课程
您还可以声明类,例如:
jshell> class Book {
...> private String title;
...> public void setTitle(String title) { this.title = title; }
...> public String getTitle() { return title; }
...> }
| created class Book
像这样使用它们:
jshell> Book book = new Book()
book ==> Book@3dd4520b
jshell> book.setTitle("Java 9");
jshell> System.out.println(book.getTitle())
Java 9
类内部定义的方法和字段的修饰符的应用方式与 Java 类似:
jshell> book.title
| Error:
| title has private access in Book
| book.title
| ^--------^
外部声明
类或接口之外的声明(以及类和接口本身的声明)遵循以下规则创建:
- 访问修饰符(public、protected和private)将被忽略。所有声明片段都可以被所有其他片段访问:
jshell> private int x = 1;
x ==> 1
jshell> System.out.print(x) // private ignored
1
- 修饰符final被忽略。允许更改和继承:
jshell> final class A {void m() {} }
| Warning:
| Modifier 'final' not permitted in top-level declarations, ignored
| final class A { void m() {} }
| ^---^
| created class A
- 修饰符static被忽略,因为没有容器类(至少没有可以使用的):
jshell> static char letter = 'A'
| Warning:
| Modifier 'static' not permitted in top-level declarations, ignored
| static char letter = 'A';
| ^----^
letter ==> 'A'
- 不允许使用修饰符default和synchronized :
jshell> synchronized void method() {}
| Error:
| Modifier 'synchronized' not permitted in top-level declarations
| synchronized void method() {}
| ^----------^
- 修饰符abstract仅可用于类:
jshell> abstract void method();
| Error:
| Modifier 'abstract' not permitted in top-level declarations
| abstract void method();
| ^------^
例外
JShell 会自动捕获异常,显示有关异常的信息,并允许您继续会话,就像什么都没发生一样。这适用于未检查异常:
<code class="lan
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~