继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java编程思想:第三章:操作符

holdtom
关注TA
已关注
手记 1703
粉丝 240
获赞 991


第三章:操作符

    在底层,在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的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP