1.赋值:使用操作符“=”、意思为:“取右边的值(即右值),把它复制给左边(即左值)”。右值可以是任何常数、变量、表达式(只要能生成一个值就可以),但左值必须是一个明确的、已命名的变量。
a.对基本类型赋值,是直接将一个地方的内容复制到另一个地方。
b.别名现象:现有一个类class Tank{int level;}
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.tank = 9;
t1.tank = 47;
t2 = t1;
t1.level = 27;
这时看,首先对每个Tank对象的level域都赋予了一个不同的值;然后t2赋值给t1,接着修改t1;
由于赋值操作的是一个对象的引用,所以修改t1的时候也修改了t2;由于t1、t2包含的是相同的引用,指向相同的对象;
这种将t1和t2绑定在同一对象上的操作就会产生别名现象;而为了保持两个对象彼此独立,采用t2.level=t1.level;这时会发现,直接操作对象内的域容易导致混乱;应该注意对对象赋值可能会产生意想不到的结果。
2.算数操作符:+、-、*、/、%;可以与赋值操作符一起使用(x+=4)
3.自增、自减:++、--
a.前缀自增/减:先执行运算,再生成值;
b.后缀自增/减:先生成值,再执行运算(先生成表达式的值,再对变量赋值);
3.关系操作符:生成的是一个boolean结果,计算的是操作数的值之间的关系;
a.测试对象的等价性:自我感觉这是一个重点
对于对象实际内容的比较用equals(),对所有对象都实用;
==和!=比较的是对象的引用,基本类型的比较也是==和!=进行比较;
b.对于自己创建的类:
假设Value a = new Value();
Value b = new Value();
v1.i = v2.i =100;
这时对a.equals(b);输出为false;这是因为equals()的默认行为是比较引用。所以要得到自己希望的行为,要在新类中覆盖equals()方法。
4.逻辑操作符:&&、||、!
与C和C++不同之处、不可将非布尔值当做布尔值在逻辑表达式中使用;
其中“短路”现象:即一旦能够明确无误的确定整个表达式的值,就不再进行表达式余下部分的计算。
5.三元操作符:boolean-exp ? value0 : value1
即boolean-exp(布尔表达式)的结果为true,计算value0,计算的值即为表达式最终值;反之,计算value1.
6.常见错误:
按位“与”“或”(&、|),而逻辑“与”“或”(&&、||)不同;“=”与“==”不同;
7.“窄化转化”:可能会造成数据丢失;在char、byte、short中,对其进行算数运算,会得到一个int结果;必须将其显示的类型转化回原来的类型,以将值赋给原本的类型;