Java的流程控制

使用运算符

运算符接受一个或多个引数(arguments),并产生新值。引数的形式不同于一般函数,但二者所产生的效应一致。

赋值、指派

赋值动作是以‘=’运算符为之。赋值(指派)的意义是取得运算符右边的值,将该值复制到运算符左边。右值可以是任何常量、变量、或有能力产生数值的表达式;左值则必须是个明确的、具名的变量,也就是说,必须有实际存储空间以存储某值。

基本型别的赋值动作相当直觉。因为基本型别存储的是实际数值,而非object reference。但进行基本型别的赋值动作时,会将某值复制到另一个值身上。

但是当操作某个对象时,操作的实际是它的reference。所以,当“将某个对象指派给另一个对象”,实际上是将其reference从某处复制到另一处。

如果对两个对象写下C=D这样的式子,会造成C和D都指向原先D所指的对象。此时如果更改D中的数据,C中的数据也会跟着变化,因为它们的reference指向的是同一个对象。这种现象通常被称为aliasing(别名),这是Java对于对象的基本处理模式,在编码过程中要特别注意。

数学运算符

Java的基本数学运算符:加法(+)、减法(-)、除法(/)、乘法(*)、模数(%,用来取整数相除后的余数)。整数除法会将所得结果的小数部分截去,不会自动四舍五入。

递增和递减

递增和递减运算符都各有两个版本,通常称为前序(prefix)版本和后续(postfix)版本。对前序递增和前序递减而言,会先进行运算然后才指派其值;而后续递增和递减,会先指派其值然后才进行运算。

关系运算符

关系运算符产生的结果是boolean。关系运算符有小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、等于(==)、不等于(!=)共六种。

关系运算符==和!=也可作用于对象身上,但此时比较的是object reference,而不是对象的内容。如果想知道对象的内容是否相同,则需要使用equals()函数。任何对象都拥有这个函数,但是equals()的缺省行为是拿reference来比较的,所以对于自建class需要根据实际需要来覆写equals()。

Java标准库中的大多数class都覆写了equals(),所以它们都会比较对象的内容(而非其referecne)是否相等。

逻辑运算符

逻辑运算符AND(&&)、OR(||)、NOTE(!)都会得到boolean值。此值究竟是true或false取决于引数间的逻辑关系。Java中的逻辑运算符只能作用在boolean值身上。

处理逻辑运算符时,有所谓“short circuiting(遂死、短路)”的现象发生。意思是说,当这个表达式的值可以被确切判断出真伪时,表达式的评估(核定)动作便会结束。如此一来,逻辑表达式中的某些部分就可能不会被评估到。

位运算

位运算符可以操作基本整数型别中的个别的位(bit)。位运算会在两个引数的相应位上执行布尔代数运算以求结果。

运算 符号 规则
AND & 两个输入位都为1时,产生一个输出位1;否则为0。
OR | 两个输入位中有任何一个为1时,产生一个输出位1;当两个皆为0时,结果为0。
XOR ^ 两个输入位恰有一个为1(但不同时为1)时,产生结果值1;否则为0。
NOT ~ 一元运算符,产生输入位的反相。如果输入位为1,则输出0;如果输入为0,则输出1。

位运算符与逻辑运算符使用同一套符号。位运算符作用于整数,而逻辑运算符作用于boolean值。有个助记法,由于位很“小”,所以位运算符仅使用一个字符符号,而逻辑运算符使用两个字符符号。

位移运算符

位移运算符也用来操作位,但仅用于基本整数型别身上。左移运算符(<<)会将左左操作数向左搬移,搬移的位个数由右操作数指定(左移后,较低位会被自动补0)。带正负号的右移运算符(>>)则将左操作数向右搬移,搬移的位个数由右操作数指定。面对带正负号的数值,右移动作会采用符号扩展(sign extension)措施:如果原值是正数,较高位便补上0;如果原值是负数,较高位便补上1。此外,Java还增加了无正负号的右移运算符(>>>),采用所谓的零扩展(zero extension):不论原值是正或负,一律在较高位处补0。

如果你所操作的位移对象是char、byte、short,位移动作发生之前,其值会被晋升成int,运算结果会是int。运算符右端所指定的位移个数,仅有较低的5个位有用。这样可以避免移动超过int所具备的位数(

2^5=32
)。类似的,如果操作的是long,运算结果也是long,指定的位移个数仅有较低的6个位有用,这能够避免移动的位数超过long所具备的位数(
2^6=64
)。

应用于String身上的+

String + 的运用有一些很有趣的行为。如果某个表达式以String为首,那么接续的所有操作数也都必须是String(编译器会将双引号括住的字符序列自动转化为String):

int x = 0, y = 1, z = 2;
String sString = "x, y, z";
System.out.println(sString + x + y + z);

在这里,Java编译器会将x、y、z转化为它们各自的String表达式,而不是先将它们加在一起。

System.out.println(x + sString);

Java会将x转换为String。

运算符优先级
优先级 运算符 结合性
1
2
3
4
5
6
7
8
9
10
11
12
13
14

流程控制

if-else
while
do-while
for
switch

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353