程序是写给人看的,不是写给机器看的!
一、操作符
+ : 加号或正号
- : 减号或负号
* : 乘
/ : 除
= : 赋值
1.优先级(与数学中的优先级相似)
若String后面紧跟一个“+”,若后面跟的为非String类型的元素,则会尝试将这个非String类型的元素转换为String。
2.赋值(=)
1)取右边的值,把它复制给左边的值。
右值只要是一个值就好,左值必须是一个明确的、已命名的变量。即:左值必须有一个物理空间可以存储等号右边的值。但不能把任何东西都赋给一个常数,常数不能作为左值(1=a)。
2)基本数据类型与对象的赋值
基本数据类型:基本数据类型存储了实际的数值,并非指向一个对象的引用,在为其赋值时,可以直接将一个地方的内容复制到另一个地方。(即a=b,a=c,此时,不会改变b的值)
对象的赋值:对一个对象进行赋值,操作的是对象的引用(即a=b,a=c,因为是abc是对象,b引用指向a,值会跟着a的改变而改变,也叫别名现象) 如:
示例一:
public class Test4 {
public static void main(String[] args) {
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 9;
t2.level = 47;
/*
* 9 47
* 简单的赋值操作
*/
System.out.println("tank1.level = " + t1.level + "tank2.level = " + t2.level);
t1 = t2;
/*
* 47 47
* 将t2赋值给t1,并将t2的引用从t2指向了t1,所以,后面t1修改之后,t2的值也会跟着修改
* 而原本指向t2的不再被引用的对象会被GC自动清理
*/
System.out.println("tank1.level = " + t1.level + "tank2.level = " + t2.level);
t1.level = 27;
/*
* 27 27
* 因为上文t2引用指向了t1,所以,t1修改,t2值也会修改
*/
System.out.println("tank1.level = " + t1.level + "tank2.level = " + t2.level);
}
}
public class Tank {
int level;
}<span style="color:#ff0000;">
</span>
示例二:
public class Test6 {
static void f(Letter l){
l.c = 'z';
}
public static void main(String[] args) {
Letter x = new Letter();
//将Letter实例化,并赋值为a
x.c = 'a';
System.out.println(" x.c = " + x.c);
//调用本类中的静态方法f(Letter l),将Letter中c的引用指向自己,即z
f(x);
System.out.println(" x.c = " + x.c);
}
}
public class Letter {
char c;
}
二、算术操作符
多一个:% 取余
生成一个随机数,可以通过Random方法。
<span style="white-space:pre"> </span>//47作为种子,目的使展示的输出都尽可能一致(用于随机数生成器的初始化值,随机数生成器对于特定的种子值总是产生相同的随机数序列)
<span style="white-space:pre"> </span>Random random = new Random(47);
三、自增(++)与自减(--)
前缀式:++a或--a
后缀式:a++或a--
区别:前缀式先执行运算,再生成值;后缀式先生成值,后运算。
public class Test7 {
public static void main(String[] args) {
int i = 1;
System.out.println("i :" + i); //1
System.out.println("++i :" + ++i); //2 原因:先运算,变为2,再赋值,输出
System.out.println("i++ :" + i++); //2 原因:先赋值,为2,输出,再运算,变为3
System.out.println(i); //3
System.out.println("--i :" + --i); //2 原因:先运算,为2,再赋值,输出
System.out.println("i-- :" + i--); //2 原因:先赋值,为2,输出,再运算,变为1
System.out.println(i); //1
}
}
四、关系运算符
小于< 大于> 小于等于<= 大于等于>=
== !=
其中,==与!=比较的是对象的引用。
若想比较两个对象的实际内容是否相同,可通过重写equals()方法来实现,若不重写,equals()默认的行为比较的也是引用。(equals()具体后面章节有详解)
五、逻辑操作符
1.短路
若(a>b) && (c>d),”&&”左边为false,则不再执行后面的操作,直接跳出。
若(a>b) || (c>d),” || ”左边为true,则不再执行后面操作,直接跳出
所以,假如逻辑表达式有一部分不必计算,将会获得潜在的性能的提升
六、三元运算符
boolean-exp ? value1 : value2
若boolean-exp 为true,则执行value1;若为false,执行value2。
不能频繁使用。
七、数据类型转换
隐式转换:byte,short,char--->int--->long--->float--->double
byte,short,char相互之间不转换,他们参与运算首先转换为int类型。
强制转换:目标类型 名称= (目标类型)需要强转的数据;
示例:
<span style="white-space:pre"> </span>byte b1=3,b2=4,b;
<span style="white-space:pre"> </span>b=b1+b2;
<span style="white-space:pre"> </span>b=3+4;
哪句是编译失败的呢?为什么呢?
b=b1+b2; 因为byte进行运算时,要先转换为int型,而b是byte型,所以编译失败。