第三章:操作符
在底层,在Java中的数据是通过使用操作符来操作的。
3.2 使用Java操作符
操作符接收一个或多个参数,并形成一个新值。参数的形式和普通的方法调用不同,单效果是相同的。使用和其他编程语言相似。
操作符的作用用于操作数,并生成一个新值。另外,有些操作符可能会改变操作数自身的值,这被称为副作用。那些能改变其操作数的操作符,最普遍的用途就是用来产生副作用;但要记住,使用此类操作符生成的值,与使用没有副作用的操作符生成的值,没有任何区别。
几乎所有的操作符都只能操作“基本类型”,例外的操作符为:=,==,!=。这些操作符能操作所有的对象。除此之外,String类支持+和+=。
3.3 优先级
当一个表达式中存在多个操作符时,操作符的优先级就决定了各部分的计算顺序。Java对计算顺序做了特定的规定。其中,最简单的规则就是先乘除后加减。程序员经常会忘记其他优先级规则,所以应该用括号()明确规定计算顺序。
注意:System.out.println语句中包含+操作符,在这种上下文环境中,+意味着字符串连接,并且如果必要,它还要执行字符串转换(非String转String)。
3.4 赋值
赋值使用的操作符时“=”。它的意思是:取右边的值,把他复制到左边。右值可以是任何常数,变量,或者表达式。但左值必须是一个明确的,已经命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。
基本数据类型的赋值是很简单的,基本类型存储了实际的值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另一个地方。例如对基本数据类型使用a=b,那么b的内容复制给a。若接着又修改了a,而b根本不会受这种修改的影响。作为程序员,这就是大多数情况下我们期望的。
但是为对象赋值的时候,情况发生了变化。对一个对象进行操作时,我们真正操作的是对对象的引用。所以一个对象赋值另一个对象,将引用从一个地方复制到另一个地方。这种特殊的现象称为别名现象,是Java操作对象的一种基本方式,任何避免呢?
t1.level = t2.level
这样便可以保持两个对象的彼此独立,而不是将t1和t2绑定到特定的对象。但你很快就意识到,直接操作对象内的域容易导致混乱,并且,违背了良好的面向对象程序设计原则。这可不是小问题,现在开始大家要注意,为对象赋值可能会产生意想不到的结果。
方法调用中的别名问题
将一个对象传递给方法时,也会产生别名问题。
别名引起的问题,以及解决方法是复杂的话题。需要注意它的存在,并在使用中注意这个陷阱。
3.5 算数操作符
常用的
+
-
*
/
%
扩展,也可以使用+=方式。
一元加,减运算符
一元减符号,用于转变数据的符号。比如:x = a * (-b)
一元加符号,只是为了和一元减符号相对应,但是它唯一的作用仅仅是将较小类型的操作数提升为int。
自增,自减,副作用的操作符。可以出现表达式的前面后者后面。
++,增加一个单位。
--,减少一个单位。
3.6 关系操作符
关系操作符生成一个boolean的结果。它们计算的是操作数的值之间的关系。
<
>
==
!=
扩展,<=等。
对象比较时,一般使用equals方法哦。
3.7 逻辑操作符
与 &&
或 ||
非 !
根据参数的逻辑关系,生成一个boolean结果值。与,或,非只可应用于boolean值。
注意:如果应该使用String的地方使用了boolean值,oolean值会自动转换成适当的文本形式。
短路
当使用逻辑操作符时,我们会遇到一种短路现象。即一旦能够明确无误的确定整个表达式的值,就不在计算表达式余下的部分。因此,整个表达式靠后的部分可能不会被运算,如:(a || b)时,如果a是真的直接返回true,而不会计算b的值。
直接常量
如果程序里使用了直接常量,编译器可以准确的知道要生成什么样的类型。但是有时候确实不可行的。如果发生这种情况,必须对编译器加以适当的“只会“,用于直接量相关的某些字符来额外增加一些信息。比如1L,1F,0x等。后面的是类型。
指数计数法
e,就是那个科学计算的e。
3.8 按位操作符
用来操作整数基本类型中的单个bit,即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。
&
|
~
3.9 移位操作符
操作的运算对象也是二进制位。只用来处理整数类型。
<<
>>
具体细节忽略。
3.10 三元操作符if-esel
格式:boolean-exp ? value0 : value 1
3.11 字符串操作 +, +=
+,连接不同的字符串。
+=,现获取原始字符串,然后连接+=后面的部分,然后赋值给表达式左边的值。
3.12 使用操作符时常见的错误
== 和 =的混乱
&& 和 &的混乱
3.13 类型转换操作符
类型转换cast的意思是,Java会一种数据类型自动转换为另一种。比如:long l = (long)25;
可以为数值进行类型转换,也可以为变量进行类型转换。注意,这里可能会引入多余的转型。Java中类型转换是一种安全的操作。然而,如果要执行一种名为窄化转换的操作,就可能面临信息丢失的危险。此时,编译器会强制我们进行类型转换。实际上这可是一种危险的事情,无论如何必须显示的类型转换。而对于扩展转换,不必显示的类型转换,因为不会造成信息的丢失。
戴尾和舍入
比如29.8转int。结果会30还是29?
强制类型转换时戴尾,如果需要四舍五入是使用java.lang.Math的round方法。
提升
如果对基本数据类型执行算数运算或按位运算,大家会发现,只要类型比int小,那么在运算之前,这些值会自动转换为int。这样最终生成的结果是int类型。如果把结果赋值给较小的类型,必须做个类型转换。通常,表达式中出现的最大的数据类型来决定表达式最终的结果类型。
3.14 Java没有typeOf
在C++中typeOf返回数据项分配的字节数。需要使用typeOf的最大原因就是移植。所以Java不需要这类方法。
©著作权归作者所有:来自51CTO博客作者u2r2otkit的原创作品,如需转载,请注明出处,否则将追究法律责任
共同学习,写下你的评论
评论加载中...
作者其他优质文章