Java编程思想第四版读书笔记——第三章 操作符

今天是Java编程思想第四版第三章读书笔记,操作符


第三章 操作符


在最底层,Java中的数据是通过使用操作符来操作的。


1.更简单的打印字句


静态导入net.mindview.util.Print类库

import static net.mindview.util.Print.*;

printf();



2.使用Java操作符


几乎所有Java操作符都只能操作“基本类型”,例外的是“=”,“==”和“!=”。

String类型支持“+”和“+=”。



3.优先级


System.out.printf()包含“+”操作符会尝试将费String类型元素转换为String。



4.赋值


对象的赋值其实是将“引用”赋值到另一个地方。

如 c = d;

那么c和d都指向原本只有d指向的对象。

下面这个小例子挺好的


t2赋给t1后,并非是互相独立桥归桥路归路。而是绑定在一起共同操作同一个对象。这种特殊的现象称为“别名现象”。



5.算术操作符


整数除法后直接去掉小数位,而非四舍五入的结果。

Random类对象



6.自动递增和递减


++i  先计算后取值

i++ 先取值后计算



7.关系操作符


==和!= 比较的是对象的引用。

public class Equivalence {
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);
}
} /* Output:
false
true



n1和n2这两个引用并不相同。


需要比较对象的实际内容使用equals(),此方法不适合基本类型。

public class EqualsMethod {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));

}
} /* Output:
true



然而,对于自定义类,需要比较对象的内容时,还需要覆盖equals()方法。

class Value {
int i;
}
public class EqualsMethod2 {
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));
}
} /* Output:
false




8.逻辑操作符


与&&,或||,非!

与在C,C++中不同,不可将一个非布尔值当做布尔值在逻辑操作符中使用

如下,i和j都是int类型,以下写法不合法:

//! print("i && j is " + (i && j));
//! print("i || j is " + (i || j));
//! print("!i is " + !i);



如果在使用String值的地方使用bool值,bool值会自动转换成适当的文本形式。(也就是打印逻辑运算式计算结果的时候自动变为文本形式的true or false)


在使用逻辑操作符时,会遇到短路现象,即

boolean a =(2>1)&& (3<1) && (5>2) && (9>3);

在计算到(3>1)为false时,后续两个式子就不再计算,结果a = false不会再改变



9.直接常量


直接常量后缀表明了它的类型,大写(或小写)L,表示long,大写(或小写)F,表示float,大写D,表示double

如:

long n3 = 200;

float f4 = 1r-43f;

十六进制 0x(0X) + 0~f

八进制 0+0~7

将变量初始化的超出表示范围,编译器会报错。

通过使用Integer和Long的toBinaryString()方法,可以轻松又随意的以二进制形式表示。

Java的指数计数法中,e表示10的幂次而非自然数2,.71那个e:

float = 1.39e-43f; 

表示1.39*10^(-43)



10.按位操作符


与&,或|,非~,异或^

&=,!=,^=。然而并没有~=,因为~是一元操作符。

对于布尔值,按位操作符具有与逻辑操作符相同效果,但是它们不会中途短路。



11.移位操作符


左移位操作符(<<),低位补0。

“有符号”右移位操作符(>>),高位补0,符号保留。

“无符号”右移位操作符(>>>),无论正负,高位补0。

char,byte,short移位前会被转换为int类型,得到结果也是int类型,只有右端低5位有效。(int类型只有32位)。

因此无符号右移时,它们会被先转成Int型,然后右移操作,然后截断,赋值给原来的类型,在这种情况下可能导致-1的结果。

如下所示:




long得到结果仍然为long,只有低6位有效。(long类型有64位)。



12.三元操作符if-else

boolean-exp ? value1 : value2;

这样虽然使代码紧凑,但是可读性降低,可以使用if else替换。



13.字符串操作符 + 和 +=


如果表达式以一个字符串起头,那么后续所有操作必须是字符串类型(会自动转换的,所有会有“” + int,int自动转换为String )。

比如:

import static net.mindview.util.Print.*;
public class StringOperators {
public static void main(String[] args) {
int x = 0, y = 1, z = 2;
String s = "x, y, z ";
print(s + x + y + z);
print(x + " " + s); // Converts x to a String

s += "(summed) = "; // Concatenation operator
print(s + (x + y + z));
print("" + x); // Shorthand for Integer.toString()
}
} /* Output:
x, y, z 012
0 x, y, z
x, y, z (summed) = 3
0



14.使用操作符时常犯的错误


while(x = y) {
// ....
}



在c,c++不会报错,在Java中编译会报错。



15.类型转换操作符


可以对变量或者数值进行类型转换(cast)。




如果执行窄化转换,数据可能会丢失,编译器会觉得是不是我们搞错了没注意到,此时需要显式的进行类型转换,强调一下。执行扩展转换,则不必显式的进行类型转换。

float和double转化为整型值时,总会对该数字执行截尾。

对于基本数据类型进行算术运算或按位运算,只要类型比int小,在运算前这些书会自动转换成int,即会自动执行数据类型提升

表达式中出现最大的数据类型决定了表达式最终的数据类型。


16.Java没有sizaof


在C和C++中,需要使用sizeof()最大的原因是为了移植。Java不需要考虑这方面问题,因为所有数据类型在所有机器中的大小是相同的。



17.操作符小结


小心溢出


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值