3.1 更简单的打印语句
import中插入了static关键字,import static net.mindview.util.Print.* ; 打印直接通过:print("Hello,World") ;可以简化代码。
3.2 使用Java操作符
利用操作符作用于操作数,生成一个新值。
3.3 优先级
先乘除后加减,还可以用括号明确计算顺序。打印语句中包含“+”操作符,进行字符串连接。
3.4 赋值
赋值就是说,取右边的值(常数、变量或表达式),把它复制给左边(必须为明确、已命名的变量)。
基本类型赋值:复制的是内容。
对象的“赋值”:复制的是引用。如对象 a=b,那么a和b复制了同一个引用(原来只有d指向的那个对象)
t1和t2两个对象在指向了同一个引用之后,当t1指向的对象被改变,t2也随之改变。
以上的f()并不只是在作用域内进行参数Letter y的复制,而是将引用传入,而进行了指向对象的修改。
3.5 算数操作符
“+”,“-”,“*”,“/”,“%(取模:从整数除法中产生余数)”,操作符紧跟等号实现运算、赋值。
产生随机数:Random rand = new Random(),当创建过程没传递参数时,Java利用当前时间作为随机数生成器的种子,所以每次都会产生不同的随机数,如果传递参数,那么种子既定,每次都会产生相同的随机数。调用Random对象的nextInt(),nextFloat,nextLong(),nextDouble()方法可以产生相应类型的随机数。
一元加减号和二元加减号相同,x=-a,和x=c-a编译器可以自动判断,一元减号可以改变符号,一元加号只是与一元减号对应并将操作数提升为int。
3.6 自动递增/自动递减
他们不仅使用了自己的值,还改变了操作数,前缀加减(++i)是先运算再生成值,后缀加减(i++)是先生成值再运算。
3.7 关系操作符
关系操作符(<,>,<=,>=,==,!=)计算操作数间关系,结果为true或false,==和!=使用包括boolean类型的所有类型,其余比较符不适用于boolean类型,true和false无法比较。
==和!=可以比较对象和基本类型,比较对象:比较的是引用;比较基本类型:直接比较的是内容。
equals():默认比较对象引用,当在新类中覆盖equals方法时,可以来比较对象内容(大多数java类库都实现了equals()方法,所以通常情况比较对象内容)。
3.8 逻辑操作符
逻辑操作符:与(&&)、或(||)、非(!)只能判断布尔值,对浮点数比较时,极微小的差异也认为“不相等”。
操作符&&和||两边条件并不是全部运行,if((....)&&(...)&&(...)):前面有一个不符合,后面即不运行。if((....)||(...)||(...)):前面有一个符合,后面也不再浪费时间运行,获得潜在性能提升。
代码:
public static void main(String args[]){
int i=3;
int j =4;
if((i<5)||(i>j++)){
System.out.println("短路"+j); //j结果为4
}
public static void main(String args[]){
int i=3;
int j =4;
if((i>5)&&(i<j++)){
System.out.println("i>5");
}
System.out.println(j); //j结果为4
}
3.9 直接常量
使用直接常量时,为保证编译器准确知道其类型,添加某些字符来增加信息,如:int f1 = 02xf; int f2 = 0x2F; int f3 = 0177;直接常量的后缀标志了类型,L代表long,F代表float,D代表double。十六进制:前缀0x,后跟随0-9或小写a-f,八进制:前缀0后跟随0~7数字。所有整数数据类型都可以用十六进制数表示,如果将变量初始化时,超过自身范围,编译器会将变量值转换为int类型后提示需要“窄化转型”。如果要将十六进制和八进制计数法的变量用二进制形式显示(二进制没有直接常量表示方法),可以通过Integer.toBinaryString()和Long.toBinaryString()方法来转化为int和long类型。
(1)指数计数法
“e”在科学工程领域代表自然对数的基数,约为2.718,但在java中,e表示10的幂次,1.39e表示1.39*10,。
注意:当编译器能识别类型时,可以不添加数值后的附加字符,如long l3 = 45; 如果像float f5 = 3e^-23来说,编译器会自动将指数作为双精度处理,如果3e^-23后没有f,编译器会报错,提示必须通过类型转换将double转换为float。
3.10 按位操作符
按位操作符操作整数基本数据类型中的单个“比特(bit)”——二进制位,对两个参数中对应的位执行布尔代数运算,并生成结果。按位操作符仅使用一个字符,&,|,异或(^),非(~),也可与=联合使用&=,|=,异或(^=),~为一元操作符不能和=连用。
3.11 移位操作符
操作二进制的位,但是只能处理整数类型, 左移位操作符(<<)能按照操作符右侧指定位数将操作符左边的操作数向左移动,右移位操作符(>>)按操作符右侧指定位数将操作符左边的操作数向右移动。
3.12 三元操作符if-else
也叫条件操作符,即 boolean-exp ? value1 : value2
如果布尔表达式值boolean-exp为true,结果为value1,值为false,结果为value2
特点:和if-else语句相比,更加简洁,但不如if-else语句更易理解
3.13 字符串操作+和+=
主要在java中连接不同的字符串。
java程序员不能实现自己的重载操作符,因为过于复杂。
这个字符串操作符如果以一个字符串开头,那么后续所有操作数都会被编译器转为字符串类型。
空的String后面跟随+和一个基本类型变量,即“”+200,可以作为不调用显示方法(Integer.toString())的字符串转换方式。
3.14 使用操作符时经常犯的错误
while(x=y) 表示赋值,在java编译时会报错,while(x==y)结果为布尔值的判断。
按位“与”和“或”可以代替逻辑“与”和“或”
3.15 类型转换
转换运算允许对数值/变量显式的进行转换,不能自动转换时强制进行类型转换。多余转型也是可以的:因为会提醒自己留意,让代码更清楚,如long l2 = (long)55。
窄化转换:容纳多信息的数据类型转为容纳少信息的类型,可能面临信息丢失危险,需强制类型转换。
扩展转换:不用显式得的进行转换,新类型能容纳原来类型的信息,信息不会丢失。
注意:布尔类型不能进行任何类型的转换类型。类数据类型也不能进行类型转换,但同一所属类型的类族间 可以类型转换
(1) 截尾和舍入
窄化转换时,截尾需注意:doule d2 = 0.9; int i6 = (int)d2;这里i6为0,将float和double转型为整型值时,总是对数字截尾。
舍入:java.lang.Math中的round()方法进行舍入。
(2)提升
对数据类型进行算数运算或按位运算,表达式中出现的最大的数据类型决定表达式结果,float和double相乘,结果为double;int和long相加,结果为long
3.16 Java中没有sizeof
C和C++中,因为不同数据类型在不同机器上有不同的大小,所以进行一些存储空间有关运算时,程序员应先熟悉类型大小,因此移植时较麻烦。
java不需要sizeof()操作符,因为所有数据类型在任何机器上的大小都一样,能被移植到任何机器上。
总结
布尔值只能被赋值,被测试真假,不能运算。
char、byte和short中,对任意一个进行算数运算都会获得int结果。
对于int值,在足够大的int值进行乘法运算时,需小心结果溢出,如下所示:
int value = Integer.MAX_VALUE;
int value2 = 3*value;
System.out.println("value2="+value2);
/*output:
value2=-3
*/