》》在最底层,java 中的数据是通过使用操作符来操作的。
》》操作符:
(1)、加号和一元的正号(+)、减号和一元的负号(-)、
乘号(*)、除号(/)、赋值(=)。这些操作符几乎
都只能支持操作“基本数据类型”
(2)、操作符:= 、 == 、 != 这几个操作符能操作所有的
对象
(3)、String 类支持 “+” 和 "+="
》》优先级:
最简单的规则就是先乘除后加减。程序员经常会忘记
其他优先级规则,所以应该用括号明确规定计算顺序。
例如;
int a ;
int b;
System.out.println("a="+a+"b="+b)
说明:在上面的输出语句中,包含“+”操作符。在这种上下
文环境中,“+”意味着“字符串连接”,并且如果必要,它还要
执行“字符串转换”。当编译器观察到一个 String 后面紧跟着
一个“+”,而这个“+”的后面又紧跟一个 非 String类型的元素时,
就会尝试着将这个非 String 类型的元素转换为 String 。正如,
上面输出的内容中,它成功的将 a 和b 从 int 类型转换成了
String 类型了。
》》赋值:
操作符:“=”
说明:“取右边的值(即右值),把它复制给左边(即左值)”
右值可以是任何常数、变量或者表达式(只要它能生成
一个值就行)。但是左值必须是一个明确的、已命名值的
变量。
也就是说,必须有一个物理空间可以存储等号右边的值。
》》对一个对象进行操作时,我们真正操作的是对对象的引用。所以
倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方
复制到另一个地方。
》》算术操作符:
符号包括: + 、 - 、/ 、* 和 % (取模操作符,它从整数
除法中产生余数)。
整数除法会直接去掉结果的小数位,而不是四舍五入地圆整结果。
》》java.util.Random
Random rand = new Random();
说明:要生成数字,可以创建一个 Random 类的对象。如果在创建
过程中没有传递任何参数,那么java 就会将当前时间作为随机
数生成器的种子,并且由此在程序每一次执行时产生不同的输
出。
在创建 Random 对象时提供参数(即种子),该种子用于
随机数生成器的初始化值,随机数生成器对于特定的种子值总
是产生相同的随机数字序列。
通过 Random 类的对象,程序可生成许多不同类型的随机
数字。只需要调用方法 nextInt() 、 nextFloat() 、nextLong() 、
nextDouble() 。传递给 nextInt() 的参数设置了所产生的随机数
的上限,而其下限为 0 。
(调用上面的方法,都是从 初始化new Random(); 的随机数字
序列中取得数字)
》》自动递增和递减:
操作符: ++ 、 --
两种使用方式:-----前缀式(先执行运算,后生成值)
++a 、 --a
-----后缀式(先生成值,再执行运算)
a++ 、a--
》》关系操作符:
### 关系操作符生成的是一个 boolean 结果,它们计算的是操作数之间的关系。
###如果关系是真实的 ,关系表达式会生成 true ;如果关系不真实,关系表达式会
生成 false 。
### 关系操作符: < 、 > 、 <= 、 >= 、== 、 !=
###其中, == 、 != 适用于所有的基本数据类型,而其他比较符不适用于boolean
类型
###关系操作符 == 、!= 也适用于所有的对象。只是比较的是对象的引用。
补充:如果想比较两个对象的实际内容是否相同 :使用 equals() 方法
但是该方法不适用于“基本数据类型”,基本数据类型直接使用 == 和 !=
即可。
#### 如果在自己定义的类中使用 equals () 方法 ,需要自己详细定义该方法的具体
实现,覆盖了父类中的 equals () 方法,这样才会看到自己希望的比较结果。
#### 大多数 Java类库都实现了 equals() 方法,以便用来比较对象的内容,而非
比较对象的引用。
》》逻辑操作符:------>使用双字符
#### 操作符: 与 (&&) 、 或(||) 、 非(!)
根据参数的逻辑关系,生成一个布尔值(true 或 false),而且只可应用于
布尔值
#### 注意,如果在应该使用 String 值的地方使用了布尔值,布尔值会自动转换
成适当的文本形式。
#### 在程序中,可以将整数类型替换成除了布尔型以外的其他任何基本数据类型。
但是要注意的是,对浮点数的比较是非常严格的。即使一个数仅在小数部分与
另一个数存在极微小的差异,仍然认为它们是“不相等”的。即使一个数只比零大
一点点,它仍然是“非零”值。
#### 短路
》》直接常量:
#### 直接常量后面的后缀字符标志了它的类型。
若为大写(或小写)L,代表 Long ,一般用大写的L ;
大写(或小写)F ,代表float ;
大写(或小写)D,代表 double
#### 十六进制数适用于所有整数数据类型,以前缀 0x (或 0X),
后面跟随 0~9 或小写(或大写)的 a~f 来表示。
#### 八进制由前缀 0 以及后续的 0~7 的数字来表示。
#### 在 Java 中二进制数没有直接常量表示方法。但是,在使用十六
进制和八进制记数法时,以二进制的形式显示结果将非常有用。
通过使用 Integer 和Long 类的静态方法 toBinaryString() 可以很
容易地实现这一点。
#### 指数记数法:
----- 在科学与工程领域,“e”代表自然对数的基数,约等于 2.718
(Java 中Math.E 给出了更精确的 double 的值)
----- 在Java 中用 e 代表“10 的幂次”
例如: 1.39e^(-43) 这样的表达式,真正的含义是 1.39 * 10^(-43)
补充:编译器通常会将指数作为双精度(double )来处理
》》按位操作符:------->使用单字符
#### 按位操作符用来操作整数基本数据类型中的单个“比特”(bit),即
二进制位。按位操作符对两个参数中对应的位执行布尔代数运算,
并最终生成一个结果。
#### 按位“与”:&
按位“或”:|
按位“异或”:^
按位“非”:~ ,也被称为取反操作符
(除了按位“非”是一元操作符,其他三种都是二元操作符)
#### 由于位是非常“小”的,所以按位操作符仅使用了一个字符。
#### 按位操作符可与等号(=) 联合使用,以便合并运算和赋值,
&= 、|= 、^= 都是合法的(由于 ~ 是一元操作符,所以不可
与"="联合使用)
#### 我们将布尔类型作为一个单比特值对待,所以它多少有些独特,
我们可对它执行按位“与”、按位“或”、按位“异或”运算,但是不能
执行按位“非”
但是在移位表达式中,不能使用布尔运算。
》》移位操作符:
#### 移位操作符运算对象也是二进制的"位"。移位操作符只可用来
处理整数类型(基本数据类型的一种)。
####左移位操作符(<<):能按照操作符右侧指定的位数来将操作符
左边的操作数向左移动(在低位补0)
“有符号"右移操作符(>>)则按照操作符右侧指定的位数将操
作符左边的操作数向右移动。
####”有符号“右移操作符使用”符号扩展“:若符号为正,则在高位插入
0 ;若符号为负,则在高位插入1 。
#### Java 中增加了一种”无符号“右移操作符(>>>),它使用"零扩展":
无论正负,都在高位插入0。
#### 如果对 char 、 byte 或者 short 类型的数值进行移位处理,那么在
移位进行之前,它们会被转换为 int 类型,并且得到的结果也是一个
int 类型的值。只有数值右端的低 5 位才有用。
#### 若对一个 long 类型的数值进行处理,最后得到的结果也是long 。
此时只会用到数值右端的低 6 位。
#### ”移位“可与”等号“(<<= 、>>=、>>>=)组合使用。此时,操作符
左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的
变量。
(但是在进行”无符号“右移位结合赋值操作时,可能会遇到一个问题:
如果对byte 或short 值进行这样的移位运算,得到的可能不是正确的
结果)
#### printBinaryInt() 和 printBinaryLong() 分别接受 int 或long 类型的
参数,并用二进制格式输出。
#### 数字的二进制表示形式称为”有符号的二进制补码“
》》三元操作符
####三元操作符也称为条件操作符。
####操作符: boolean-exp? value0 : value 1
如果 boolean-exp 的结果为 true :则计算 value0
如果 boolean-exp 的结果为false :则计算 value1
####三元操作符 和 if--else 完全不同,因为它会产生一个值。
#### 在使用三元操作符时,请务必仔细考虑。
》》字符串操作符 + 和 +=
#### 这个操作符在 Java 中有一项特殊的用途:连接不同的字符串。
#### 如果表达式以一个字符串起头,那么后续所有操作数都必须是
字符串型(请记住,编译器会把双引号内的字符序列自动转成
字符串)
》》使用操作符时常犯的错误:
#### 即使对表达式如何计算有点不确定,也不愿意使用括号。
》》类型转换操作符:
####类型转换运算允许我们显式地进行数据类型的转换,或者不能在
自动进行转换的时候强制进行类型的转换。
#### 要想执行类型转换,需要将希望得到的数据类型置于圆括号内,
放在要进行类型转换值的左边。
#### 即可对数值进行类型转换,亦可对变量进行类型转换。
(编译器在必要的时候会自动进行 int 值到 long 值的提升)
####如果要执行一种名为窄化转换的操作(也就是说,将能容纳
更多信息的数据类型转换成无法容纳那么多信息的类型),就有可能
面临信息丢失的危险。 必须显示地进行类型转换。
#### 对于扩展转换,则不必显示地进行类型转换,因为新类型肯定能
容纳原来类型的信息,不会造成任何信息的丢失。
#### Java 允许我们把任何基本数据类型转换成别的基本数据类型,
但是布尔值根本不允许进行任何类型的转换处理。
#### 截尾和舍入
----在执行窄化转换时,必须注意截尾和舍入问题。例如,如果将一个
浮点值转换为整型值,java 会如何处理呢?
**** 在将 float 或 double 转型为整型值时,总是对该数字执行截尾。
****如果想要得到舍入的结果:需要使用 java.lang.Math 中的 round
方法
#### 提升:
--- 通常,表达式中出现的最大的数据类型决定了表达式最终
结果的数据类型(小的数据类型会自动提升为大的数据类型)
》》Java中没有 sizeof
#### Java 不需要 sizeof() 操作符,因为所有的数据类型在所有机器中
的大小都是相同的。我们不必考虑移植问题----它已经被设计在语言
中了。
》》操作符小结:
#### 能够对布尔型值进行的运算非常有限。我们只能赋予它 true 或 false 值,
并测试它为真还是假,而不能将布尔值进行相加,或对布尔值进行其他
任何运算
#### 如果对两个足够大的 int 值执行乘法运算,结果会溢出。
#### 当类型转换为一种较小的类型时,必须留意”窄化转换“的结果,否则会
在类型转化过程中不知不觉地丢失了信息。