运算符:参考
编辑运算符:参考
编辑方法调用
编辑使用 方法调用运算符 '()'
来调用 引用类型值的成员方法。在方法调用期间,会根据需要对每个参数进行隐式装箱/拆箱求值。当对 def
类型值进行方法调用时,参数和返回值类型也会被视为 def
类型,并在运行时进行求值。
重载方法是指与两个或多个方法共享相同名称的方法。方法的重载基于参数个数,即只要参数数量不同,就可以为多个方法重复使用相同的名称。
错误
- 如果引用类型值为
null
。 - 如果给定的引用类型值不存在该成员方法名。
- 如果传入的参数数量与指定的参数数量不同。
- 如果参数无法隐式转换为参数的正确类型值或隐式装箱/拆箱为参数的正确类型值。
语法
method_call: '.' ID arguments; arguments: '(' (expression (',' expression)*)? ')';
示例
-
对不同引用类型的方法调用。
Map m = new HashMap(); m.put(1, 2); int z = m.get(1); def d = new ArrayList(); d.add(1); int i = Integer.parseInt(d.get(0).toString());
声明
Map m
;分配HashMap
实例 →HashMap 引用
;将HashMap 引用
存储到m
从
m
加载 →Map 引用
;隐式将int 1
转换为def
→def
;隐式将int 2
转换为def
→def
;在Map 引用
上使用参数 (int 1
,int 2
) 调用put
声明
int z
;从m
加载 →Map 引用
;在Map 引用
上使用参数 (int 1
) 调用get
→def
;隐式将def
转换为int 2
→int 2
;将int 2
存储到z
声明
def d
;分配ArrayList
实例 →ArrayList 引用
;隐式将ArrayList
转换为def
→def
;将def
存储到d
从
d
加载 →def
;隐式将def
转换为ArrayList 引用
→ArrayList 引用
在ArrayList 引用
上使用参数 (int 1
) 调用add
;声明
int i
;从d
加载 →def
;隐式将def
转换为ArrayList 引用
→ArrayList 引用
在ArrayList 引用
上使用参数 (int 1
) 调用get
→def
;隐式将def
转换为Integer 1 引用
→Integer 1 引用
;在Integer 1 引用
上调用toString
→String '1'
;在Integer
上使用参数 (String '1'
) 调用parseInt
→int 1
;将int 1
存储到i
中;
字段访问
编辑使用 字段访问运算符 '.'
来存储值到或从 引用类型成员字段加载值。
错误
- 如果引用类型值为
null
。 - 如果给定的引用类型值不存在该成员字段名称。
语法
field_access: '.' ID;
示例
示例使用以下引用类型定义
name: Example non-static member fields: * int x * def y * List z
-
使用
Example
类型的字段访问。Example example = new Example(); example.x = 1; example.y = example.x; example.z = new ArrayList(); example.z.add(1); example.x = example.z.get(0);
声明
Example example
;分配Example
实例 →Example 引用
;将Example 引用
存储到example
从
example
加载 →Example 引用
;将int 1
存储到Example 引用
的x
从
example
加载 →Example 引用 @0
;从example
加载 →Example 引用 @1
;从Example 引用 @1
的x
加载 →int 1
;隐式将int 1
转换为def
→def
;将def
存储到Example 引用 @0
的y
;(注意Example 引用 @0
和Example 引用 @1
是相同的)从
example
加载 →Example 引用
;分配ArrayList
实例 →ArrayList 引用
;隐式将ArrayList 引用
转换为List 引用
→List 引用
;将List 引用
存储到Example 引用
的z
从
example
加载 →Example 引用
;从Example 引用
的z
加载 →List 引用
;在List 引用
上使用参数 (int 1
) 调用add
从
example
加载 →Example 引用 @0
;从example
加载 →Example 引用 @1
;从Example 引用 @1
的z
加载 →List 引用
;在List 引用
上使用参数 (int 0
) 调用get
→int 1
;将int 1
存储到List 引用 @0
的x
中;(注意Example 引用 @0
和Example 引用 @1
是相同的)
空安全
编辑使用 空安全运算符 '?.'
而不是方法调用运算符或字段访问运算符,以确保引用类型值在方法调用或字段访问之前为 非 null
。如果引用类型值为 null
,将返回 null
值,否则将求值方法调用或字段访问。
错误
- 如果方法调用返回类型值或字段访问类型值不是引用类型值,并且不能隐式转换为引用类型值。
语法
null_safe: null_safe_method_call | null_safe_field_access ; null_safe_method_call: '?.' ID arguments; arguments: '(' (expression (',' expression)*)? ')'; null_safe_field_access: '?.' ID;
示例
示例使用以下引用类型定义
name: Example non-static member methods: * List factory() non-static member fields: * List x
-
没有
null
值的空安全。 -
带有
null
值的空安全;
列表初始化
编辑使用 列表初始化运算符 '[]'
在堆上分配一个带有预定义值集的 List
类型实例。用于初始化 List
类型实例的每个值在插入 List
类型实例时,使用 add
方法转换为 def
类型值。将保留指定值的顺序。
语法
list_initialization: '[' expression (',' expression)* ']' | '[' ']';
示例
-
空的
List
类型值的列表初始化。 -
具有静态值的列表初始化。
-
具有非静态值的列表初始化。
声明
int i
;将int 1
存储到i
声明
long l
;将long 2
存储到l
声明
float f
;将float 3.0
存储到f
声明
double d
;将double 4.0
存储到d
声明
String s
;将String "5"
存储到s
声明
List list
;分配ArrayList
实例 →ArrayList 引用
;从i
加载 →int 1
;在ArrayList 引用
上使用参数 (int 1
) 调用add
;从l
加载 →long 2
;在ArrayList 引用
上使用参数 (long 2
) 调用add
;从f
加载 →float 3.0
;从d
加载 →double 4.0
;提升float 3.0
和double 4.0
:结果double
;隐式将float 3.0
转换为double 3.0
→double 3.0
;将double 3.0
和double 4.0
相乘 →double 12.0
;在ArrayList 引用
上使用参数 (double 12.0
) 调用add
;从s
加载 →String "5"
;在ArrayList 引用
上使用参数 (String "5"
) 调用add
;隐式将ArrayList 引用
转换为List 引用
→List 引用
;将List 引用
存储到list
列表访问
编辑使用 列表访问运算符 '[]'
作为在 List
类型值上进行的 set
方法调用或 get
方法调用的快捷方式。
错误
- 如果访问的值不是
List
类型值。 - 如果使用非整数类型值作为
set
方法调用或get
方法调用的索引。
语法
list_access: '[' expression ']'
示例
-
使用
List
类型的列表访问。List list = new ArrayList(); list.add(1); list.add(2); list.add(3); list[0] = 2; list[1] = 5; int x = list[0] + list[1]; int y = 1; int z = list[y];
声明
List list
; 分配ArrayList
实例 →ArrayList 引用
; 隐式转换ArrayList 引用
到List 引用
→List 引用
; 存储List 引用
到list
从
list
加载 →List 引用
; 在List 引用
上调用add
,参数为(int 1
)从
list
加载 →List 引用
; 在List 引用
上调用add
,参数为(int 2
)从
list
加载 →List 引用
; 在List 引用
上调用add
,参数为(int 3
)从
list
加载 →List 引用
; 在List 引用
上调用set
,参数为(int 0
,int 2
)从
list
加载 →List 引用
; 在List 引用
上调用set
,参数为(int 1
,int 5
)声明
int x
; 从list
加载 →List 引用
; 在List 引用
上调用get
,参数为(int 0
) →def
; 隐式转换def
到int 2
→int 2
; 从list
加载 →List 引用
; 在List 引用
上调用get
,参数为(int 1
) →def
; 隐式转换def
到int 5
→int 5
; 将int 2
和int 5
相加 →int 7
; 存储int 7
到x
声明
int y
; 存储int 1
到y
声明
int z
; 从list
加载 →List 引用
; 从y
加载 →int 1
; 在List 引用
上调用get
,参数为(int 1
) →def
; 隐式转换def
到int 5
→int 5
; 存储int 5
到z
-
使用
def
类型访问 List。def d = new ArrayList(); d.add(1); d.add(2); d.add(3); d[0] = 2; d[1] = 5; def x = d[0] + d[1]; def y = 1; def z = d[y];
声明
List d
; 分配ArrayList
实例 →ArrayList 引用
; 隐式转换ArrayList 引用
到def
→def
; 存储def
到d
从
d
加载 →def
; 隐式转换def
到ArrayList 引用
→ArrayList 引用
; 在ArrayList 引用
上调用add
,参数为(int 1
)从
d
加载 →def
; 隐式转换def
到ArrayList 引用
→ArrayList 引用
; 在ArrayList 引用
上调用add
,参数为(int 2
)从
d
加载 →def
; 隐式转换def
到ArrayList 引用
→ArrayList 引用
; 在ArrayList 引用
上调用add
,参数为(int 3
)从
d
加载 →def
; 隐式转换def
到ArrayList 引用
→ArrayList 引用
; 在ArrayList 引用
上调用set
,参数为(int 0
,int 2
)从
d
加载 →def
; 隐式转换def
到ArrayList 引用
→ArrayList 引用
; 在ArrayList 引用
上调用set
,参数为(int 1
,int 5
)声明
def x
; 从d
加载 →def
; 隐式转换def
到ArrayList 引用
→ArrayList 引用
; 在ArrayList 引用
上调用get
,参数为(int 0
) →def
; 隐式转换def
到int 2
→int 2
; 从d
加载 →def
; 隐式转换def
到ArrayList 引用
→ArrayList 引用
; 在ArrayList 引用
上调用get
,参数为(int 1
) →def
; 隐式转换def
到int 2
→int 2
; 将int 2
和int 5
相加 →int 7
; 存储int 7
到x
声明
int y
; 存储int 1
到y
声明
int z
; 从d
加载 →ArrayList 引用
; 从y
加载 →def
; 隐式转换def
到int 1
→int 1
; 在ArrayList 引用
上调用get
,参数为(int 1
) →def
; 存储def
到z
Map 初始化
编辑使用 map 初始化运算符 '[:]'
在堆上分配一个 Map
类型实例,并带有一组预定义的值。用于初始化 Map
类型实例的每对值,在使用 put
方法插入 Map
类型实例时,都会被转换为 def
类型的值。
语法
map_initialization: '[' key_pair (',' key_pair)* ']' | '[' ':' ']'; key_pair: expression ':' expression
示例
-
初始化一个空的
Map
类型值。 -
使用静态值初始化 Map。
-
使用非静态值初始化 Map。
byte b = 0; int i = 1; long l = 2L; float f = 3.0F; double d = 4.0; String s = "5"; Map map = [b:i, l:f*d, d:s];
声明
byte b
; 存储byte 0
到b
声明
int i
;将int 1
存储到i
声明
long l
;将long 2
存储到l
声明
float f
;将float 3.0
存储到f
声明
double d
;将double 4.0
存储到d
声明
String s
;将String "5"
存储到s
声明
Map map
; 分配HashMap
实例 →HashMap 引用
; 从b
加载 →byte 0
; 从i
加载 →int 1
; 在HashMap 引用
上调用put
,参数为(byte 0
,int 1
); 从l
加载 →long 2
; 从f
加载 →float 3.0
; 从d
加载 →double 4.0
; 提升float 3.0
和double 4.0
: 结果为double
; 隐式转换float 3.0
到double 3.0
→double 3.0
; 将double 3.0
和double 4.0
相乘 →double 12.0
; 在HashMap 引用
上调用put
,参数为(long 2
,double 12.0
); 从d
加载 →double 4.0
; 从s
加载 →String "5"
; 在HashMap 引用
上调用put
,参数为(double 4.0
,String "5"
); 隐式转换HashMap 引用
到Map 引用
→Map 引用
; 存储Map 引用
到map
Map 访问
编辑使用 map 访问运算符 '[]'
作为对 Map
类型值进行 put
方法调用或 get
方法调用的快捷方式。
错误
- 如果访问的值不是
Map
类型值。
语法
map_access: '[' expression ']'
示例
-
使用
Map
类型进行 Map 访问。Map map = new HashMap(); map['value2'] = 2; map['value5'] = 5; int x = map['value2'] + map['value5']; String y = 'value5'; int z = x[z];
声明
Map map
; 分配HashMap
实例 →HashMap 引用
; 隐式转换HashMap 引用
到Map 引用
→Map 引用
; 存储Map 引用
到map
从
map
加载 →Map 引用
; 在Map 引用
上调用put
,参数为(String 'value2'
,int 2
)从
map
加载 →Map 引用
; 在Map 引用
上调用put
,参数为(String 'value5'
,int 5
)声明
int x
; 从map
加载 →Map 引用
; 在Map 引用
上调用get
,参数为(String 'value2'
) →def
; 隐式转换def
到int 2
→int 2
; 从map
加载 →Map 引用
; 在Map 引用
上调用get
,参数为(String 'value5'
) →def
; 隐式转换def
到int 5
→int 5
; 将int 2
和int 5
相加 →int 7
; 存储int 7
到x
声明
String y
; 存储String 'value5'
到y
声明
int z
; 从map
加载 →Map 引用
; 从y
加载 →String 'value5'
; 在Map 引用
上调用get
,参数为(String 'value5'
) →def
; 隐式转换def
到int 5
→int 5
; 存储int 5
到z
-
使用
def
类型进行 Map 访问。def d = new HashMap(); d['value2'] = 2; d['value5'] = 5; int x = d['value2'] + d['value5']; String y = 'value5'; def z = d[y];
声明
def d
; 分配HashMap
实例 →HashMap 引用
; 隐式转换HashMap 引用
到def
→def
; 存储def
到d
从
d
加载 →def
; 隐式转换def
到HashMap 引用
→HashMap 引用
; 在HashMap 引用
上调用put
,参数为(String 'value2'
,int 2
)从
d
加载 →def
;隐式转换def
到HashMap 引用
→HashMap 引用
;在HashMap 引用
上调用put
方法,参数为 (String 'value5'
,int 5
)声明
int x
;从d
加载 →def
;隐式转换def
到HashMap 引用
→HashMap 引用
;在HashMap 引用
上调用get
方法,参数为 (String 'value2'
) →def
;隐式转换def
到int 2
→int 2
;从d
加载 →def
;在HashMap 引用
上调用get
方法,参数为 (String 'value5'
) →def
;隐式转换def
到int 5
→int 5
;将int 2
和int 5
相加 →int 7
;将int 7
存储到x
声明
String y
; 存储String 'value5'
到y
声明
def z
;从d
加载 →def
;从y
加载 →String 'value5'
;在HashMap 引用
上调用get
方法,参数为 (String 'value5'
) →def
;将def
存储到z
新实例操作符
编辑使用 新实例操作符 'new ()'
在堆上分配一个 引用类型 实例,并调用指定的构造函数。在构造函数调用期间,会根据需要对每个参数进行隐式 装箱/拆箱。
重载的构造函数是指与两个或多个构造函数共享相同名称的构造函数。构造函数基于参数数量进行重载,其中只要参数数量不同,相同的引用类型名称就可以用于多个构造函数。
错误
- 如果实例分配的引用类型名称不存在。
- 如果传入的参数数量与指定的参数数量不同。
- 如果参数无法隐式转换为参数的正确类型值或隐式装箱/拆箱为参数的正确类型值。
语法
new_instance: 'new' TYPE '(' (expression (',' expression)*)? ')';
示例
- 分配不同类型的新实例。
字符串连接
编辑使用 字符串连接操作符 '+'
将两个值连接在一起,其中至少一个值是 String
类型。
语法
concatenate: expression '+' expression;
示例
-
字符串与不同原始类型连接。
-
字符串与
def
类型连接。
Elvis 操作符
编辑Elvis 操作符包含两个表达式。首先评估第一个表达式以检查是否存在 null
值。如果第一个表达式评估为 null
,则评估第二个表达式并使用其值。如果第一个表达式评估为 非 null
,则使用第一个表达式的结果值。使用 elvis 操作符 '?:'
作为条件操作符的快捷方式。
错误
- 如果第一个或第二个表达式不能产生
null
值。
语法
elvis: expression '?:' expression;
示例
-
Elvis 操作符与不同的引用类型一起使用。
声明
List x
;分配ArrayList
实例 →ArrayList 引用
;隐式转换ArrayList 引用
到List 引用
→List 引用
;将List 引用
存储到x
;声明
List y
;加载x
→List 引用
;List 引用
等于null
→false
;评估第一个表达式:List 引用
→List 引用
;将List 引用
存储到y
将
null
存储到y
;声明
List z
;加载y
→List 引用
;List 引用
等于null
→true
;评估第二个表达式:分配ArrayList
实例 →ArrayList 引用
;隐式转换ArrayList 引用
到List 引用
→List 引用
;将List 引用
存储到z
;