JShell 入门第 2 部分

发布日期:2026-07-13 10:18:06   来源 : 杭州电子商务研究院    浏览量 :13
杭州电子商务研究院 发布日期:2026-07-13 10:18:06  
13

前言

在本系列的第一篇指南中,您了解了什么是 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
|  ^--------^
    

外部声明

类或接口之外的声明(以及类和接口本身的声明)遵循以下规则创建:

  1. 访问修饰符(publicprotectedprivate)将被忽略。所有声明片段都可以被所有其他片段访问:
      jshell> private int x = 1;
x ==> 1

jshell> System.out.print(x) // private ignored
1
    
  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
    
  1. 修饰符static被忽略,因为没有容器类(至少没有可以使用的):
      jshell> static char letter = 'A'
|  Warning:
|  Modifier 'static'  not permitted in top-level declarations, ignored
|  static char letter = 'A';
|  ^----^
letter ==> 'A'
    
  1. 不允许使用修饰符defaultsynchronized :
      jshell> synchronized void method() {}
|  Error:
|  Modifier 'synchronized'  not permitted in top-level declarations
|  synchronized void method() {}
|  ^----------^
    
  1. 修饰符abstract仅可用于类:
      jshell> abstract void method();
|  Error:
|  Modifier 'abstract'  not permitted in top-level declarations
|  abstract void method();
|  ^------^
    

例外

JShell 会自动捕获异常,显示有关异常的信息,并允许您继续会话,就像什么都没发生一样。这适用于未检查异常:

      <code class="lan
以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据