接受参数并生成新值。与普通方法调用殊途同归。所有运算符都能根据自己的运算对象生成一个值。
可改变运算对象的值。
修改自己的运算对象,从而产生副作用。注意生成的值亦可由没有副作用的运算符生成。
几乎所有运算符都只能操作基本类型(Primitives)。
唯一例外是 =
、==
和 !=
,它们能操作所有对象(这也是令人混淆的一个地方)。
此外,String 类支持 +
和 +=
。编译器会将 +
连接的非字符串尝试转换为字符串
决定了存在多个运算符时一个表达式各部分的运算顺序。程序员经常习惯性忘记优先级规则,所以要用括号明确规定运算顺序。
获取右值并赋给左值。右值可以是任何常量、变量或者可产生一个返回值的表达式。左值必须是一个明确的、已命名的变量。即要有一个物理空间存放右值。
基本类型的赋值很简单。因为基本类型持有的是实际的值而非一个对象的引用。只是将内容从一个地方复制到另一个地方。
赋值对象时,实际上是把引用从一个地方复制到另一个地方。这种现象通常称为别名(aliasing),这是 Java 处理对象的一种基本方式。这种场景经常出现在方法参数的传递。
==
和 !=
比较的是对象引用,所以比较两个对象的内容是否相同必须使用所有对象(不包括基本类型)中都存在的 equals()
方法&&
(AND)、||
(OR)和 !
(非)根据参数的逻辑关系生成布尔值 true
或 false。在 Java 逻辑运算中,不能像 C/C++ 那样使用非布尔值, 而仅能使用 AND、 OR、 NOT。
向程序中插入一个字面值常量时,编译器会确切地识别它的类型。当类型不明确时,必须辅以字面值常量关联来帮助编译器识别。
在文本值的后面添加字符可以让编译器识别该文本值的类型。对于 Long 型数值,结尾使用大写 L
或小写 l
皆可(不推荐使用 l
,因为容易与阿拉伯数值 1 混淆)。大写 F
或小写 f
表示 float 浮点数。大写 D
或小写 d
表示 double 双精度。
0x
或 0X
表示,后跟 0-9 或 a-f (大写或小写)0
表示0b
或 0B
表示,它可以初始化所有的整数类型。使用整型数值类型时,显示其二进制形式会很有用。在 Long 型和 Integer 型中这很容易实现,调用其静态的 toBinaryString()
方法即可。若将较小的类型传递给 Integer.tobinarystring()
时,类型将自动转换为 int_
,以使结果更清晰
仅限单 _
,不能多条相连
数值开头和结尾不允许出现 _
F
、D
和 L
的前后禁止出现 _
二进制前导 b
和 十六进制 x
前后禁止出现 _
对两个整数对应的位执行布尔代数,从而产生结果。源自 C 语言的底层操作,嵌入式开发中经常要直接操纵硬件,频繁设置硬件寄存器内的二进制位。Java 的设计初衷是电视机顶盒嵌入式开发,所以这种底层的操作仍被保留了下来。
对象也是二进制的“位”。只能用于处理整数类型
<<
能将其左边的运算对象向左移动右侧指定的位数(在低位补 0)>>
则相反,右移位运算符有“正”、“负”值:若值为正,则在高位插入 0;若值为负,则在高位插入 1。Java 也添加了一种“不分正负”的右移位运算符(>>>),它使用了“零扩展”(zero extension):无论正负,都在高位插入 0。这一运算符是 C/C++ 没有的。也称为条件运算符。
布尔表达式 ? 值 1 : 值 2 若表达式计算为 true,则返回结果 值 1 ;如果表达式的计算为 false,则返回结果 值 2。
当然,也可以换用普通的 if-else 语句(在后面介绍),但三元运算符更加简洁
这个运算符在 Java 里有一项特殊用途:连接字符串。
若表达式以一个 String 类型开头(编译器会自动将双引号 ""
标注的的字符序列转换为字符串),那么后续所有运算对象都必须是字符串。
可以在程序未自动转换时显式、强制地使此类型发生转换。要执行强制转换,需要将所需的数据类型放在任何值左侧的括号内。
为了程序逻辑清晰或提醒自己,也可以使用显式类型转换。在其他情况下,类型转换型只有在代码编译时才显出其重要性。
表达式中最大的数据类型是决定表达式结果的数据类型。
对小于 int 的基本数据类型(即 char、byte 或 short)执行任何算术或按位操作,这些值会在执行操作之前类型提升为 int,并且结果值的类型为 int。若想重新使用较小的类型,必须使用强制转换(由于重新分配回一个较小的类型,结果可能会丢失精度)。Java 不需要 sizeof()
方法,因为所有类型的大小在不同平台上是相同的。