操作符
关系操作符
class Tank{
int level;
}
public class Assignment {
public static void main(String[] args){
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 47;
System.out.println ("1: t1.level:" + t1.level + ", t2.level:" + t2.level);
t1 = t2;
System.out.println ("1: t1.level:" + t1.level + ", t2.level:" + t2.level);
t1.level = 27;
System.out.println ("1: t1.level:" + t1.level + ", t2.level:" + t2.level);
}
//out: t1.level: 9, t2.level: 47
// t1.level: 47, t2.level: 47
// t1.level: 27, t2.level: 27
赋值操作是对象的应用,所以改变t1时也改变了t2
class Letter{
char c;
}
public class Assignment {
static void f(Letter y){
y.c = 'z';
}
public static void main(String[] args){
Letter x = new Letter();
x.c = 'a';
System.out.println("1: x.c: " + x.c);
f(x);
System.out.println("2: x.c: " + x.c);
}
}
//out: 1: x.c: a
// 2: x.c: z
public class Assignment {
public static void main(String[] args){
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println( n1 != n2);
System.out.println(n1.equals(n2));
}
}
// out: false true true
因为两个Integer对象都是相同的,尽管对象内容相同但对象引用却不同,而==
和!=
比较的是对象的引用. equals()
的默认行为是比较引用。
class Value{
int i;
}
public class Assignment {
public static void main(String[] args){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
}
// out: false
按位操作符和移位操作符
按位操作符和移位操作符全部按二进位位进行计算
<center>
<font size=2>
符号 | 名称 | 用法 | 运算规则 |
---|---|---|---|
& | 按位与运算符 | 同为1时值为1,负数按补码形式参与 | 0&0=0; 0&1=0; 1&0=0; 1&1=1 |
| | 按位或运算符 | 只要有一个为1,其值为1,负数按补码形式参与 | 0|0=0; 0|1=1; 1|0=1; 1|1=1 |
^ | 异或运算符 | 相应位为异时值为1 | 0^0=0; 0^1=1; 1^0=1; 1^1=0 |
~ | 取反运算符 | 按位取反 | ~1=0; ~0=1 |
>> | 右移运算符 | 全部右移若干位,正数左补0,负数左补1,右边丢弃 | 每右移一位,相当于该数除以2 |
<< | 左移运算符 | 全部左移若干位,右边补0,左边丢弃 | 每左移一位,相当于该数乘以2 |
>>> | 无符号右移运算符 | 全部右移若干位,左边补0,右边丢弃 | - |
</center>
</font>
复合赋值运算符
位运算符和赋值运算符可以结合有如下运算符:
<center>&=
; |=
; >>=
; <<=
; ^=
</center>
a &= b
相当于a=a & b
, 其他复合赋值运算符类似
不同长度的数据进行位运算
如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算(long型数据与int型数据进行与运算)。右端对齐后,左边不足的位依下面三种情况补足:
- 如果整型数据为正数,左边补16个0。
- 如果整型数据为负数,左边补16个1。
- 如果整形数据为无符号数,左边也补16个0
三元操作符if-else
三元操作符也成为条件操作符,有三个操作数,和普通的if-else不同的是表达式如下:
<center> boolean-exp ? value) : value1
</center>
如果boolean-exp(布尔表达式)的结果为true,就计算value0, 如果为false,就计算value1.
单元操作符景观高效率简介,但他很容易产生可读性很差的代码。他和if-else完全不同,因为它会产生一个值
类型转换操作符
Java中可以从任意基本数据类型转型到外的基本数据类型,boolean类型不可以转换为其他的数据类型.
整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:
- 容量小的类型默认转换为容量大的数据类型;数据类型按容量大小排序为:
byte
,short
,char
,->int
->long
->float
->double
;
byte
,short
,char
之间不会相互转换他们三者在计算时首先会转换为int
类型;- 容量大的数据类型转换为容量小的数据类型时,要叫上强制转换符,
但是可能造成精度降低或溢出(double
转换成float
时会溢出),使用时要格外注意;- 有多种类型的数据混合运算时,系统会首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算;
- 实数常量,浮点型默认为
double
类型.整数常量默认为int
类型;
截尾和舍入
float和double 转为整形时,总是对该数字进行截尾,如果想得到摄入的结果,需要用到java.land.Math
中的roung()
public class Assignment {
public static void main(String[] args){
double above = 0.7, below = 0.4;
float fabove = 0.7f, fbelow = 0.4f;
System.out.println("(int)above: "+ (int)above);
System.out.println("(int)below: "+ (int)below);
System.out.println("(int)fabove: "+ (int)fabove);
System.out.println("(int)fabove: "+ (int)fabove);
System.out.println("Math.round(above): "+ Math.round(above));
System.out.println("Math.round(below): "+ Math.round(below));
System.out.println("Math.round(fabove): "+ Math.round(fabove));
System.out.println("Math.round(fbelow): "+ Math.round(fbelow));
}
}
//out: (int)above: 0; (int)below: 0; (int)fabove: 0; (int)fabove: 0
// Math.round(above): 1; Math.round(below): 0;
// Math.round(fabove): 1; Math.round(fbelow): 0
网友评论