thinking in java ----reading note

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinking in java ----reading note 相关的知识,希望对你有一定的参考价值。

# thinking in java 4th
# reading note
# victor
# 2016.03.13

chapter 3 控制程序流程

3.1 java 运算符
    几乎所有运算符都只能操作"基本值类型"."=","=="和"!=" 能操作所有对象,String类支持"+"和"+=".

3.1.1 优先级
    运算符的优先级决定了存在多个运算符时一个表达式个部分的计算顺序。推荐使用"()"来明确计算顺序。

3.1.2 赋值
    赋值是使用"="运算符进行的,它的意思是“取得右边的值,把它复制到左边”。右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行。但左边的值必须是一个明确的已命名的变量。也就是说,它必须有一个物理性的空间来保存右边的值。
    对于基本值类型的赋值,实现了上述的复制操作,因为基本值类型容纳了实际的值。
    但是,对象赋值时,情况发生了变化。因为对一个对象操作时,我们操作的是它的句柄,所以A=B,实际上是将句柄复制。所以A和B指向了同一个对象。
    此外,对象作为方法参数传递时,实际上传递的也是句柄。

3.1.3 算术运算符
    java的基本算术操作符包括"+","-","*","/"和模数"%"(取余).其中整数除法会直接去掉小数,而不是进位.
    简写:将基本算术运算符与等号放在一起,同时实现赋值操作."+=","-=","*=","/="和"%=".
    一元操作符"+"和"-",分别表示正负值.

3.1.4 自动递增和递减
    ++a,--a : 前缀形式 执行完运算后才得到值.
    a++,a-- : 后缀形式 运算前就得到值.

3.1.5 关系运算符
    关系运算符评价的是运算对象值之间的关系,生成一个Boolean值.运算符包括"<",">","<=",">=","=="和"!=".
    usage:判断对象是否相等
    code:
        integer n1 = new integer(47);
        integer n2 = new integer(47);
        System.out.println(n1 == n2);
        System.out.println(n1 != n2);
    out: false, true
    reason: 尽管对象是相同的,但是句柄不同,而"==" 和 "!=" 比较的正是对象句柄.
    solution:若想比较两个对象的内容是否相同,可以使用所有对象适用的方法 equals().但是对于"基本值类型" 直接使用"==" 和 "!=" 即可.注意,自己类中的equals() 方法需要自己实现对对象内容的比较(@override).

3.1.6 逻辑运算符
    "&&"(AND),"||"(OR),"!"(NOT) 能生成一个BOOLEAN值.
    短路: 只有明确得出整个表达式真或假的结论,才会对表达式进行逻辑求值。因此,一个逻辑表达式的所有部分都有可能不进行求值.

3.1.7 按位操作符
    按位操作符允许我们操作单个比特,即二进制位.
    "&"(与) AND, "|"(或) OR,"~"(非) NOT,"^"(异或) XOR.
    注: 对于BOOLEAN值按位操作符具有与逻辑运算符相同的效果,只是它们不会中途"短路"

3.1.8 移位运算符
    移位操作符面向的运算对象也是二进制的"位".左移位运算符("<<")能将运算符左边的运算对象向左移动运算符右侧指定的位数(低位补0).
    "有符号"右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数."有符号"右移右移位运算符使用了"符号扩展":若值为正,则在高位插入 0;若值为负,则在高位插入1.Java也添加了一种"无符号"右移位运算符(>>>),它使用了"零扩展":无论正负,都在高位插入0.
    若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int.只有右侧的5个低位才会用到.这样可防止我们在一个int数里移动不切实际的位数.若对一个long值进行处理,最后得到的结果也是long.此时只会用到右侧的6个低位,防止移动超过long值里现成的位数.但在进行"无符号"右移位时,也可能遇到一个问题.若对byte或short值进行右移位运算,得到的可能不是正确的结果.它们会自动转换成int类型,并进行右移位.

3.1.9 三元 if-else运算符
    布尔表达式?值0:值1 .如果布尔表达式为 true,就计算"值0",若为 false,计算"值1".

3.1.10 逗号运算符
    java中的逗号运算符只在for循环中使用.

3.1.11 字串运算符"+"
    这个运算符在java中用于连接不同的字串.
    注意:若表达式以一个String开头,那么后续所有运算对象必须是字符串.

3.1.12 造型运算符
    "造型"(cast)的作用是在java中将一种数据类型转换成另一种数据类型.
    例如: int i =200; long I =(long)i;
    java允许我们将任何主类型"造型"成其它任何一种主类型,但Boolean除外.通常,表达式中最大的数据类型是决定了表达式最终结果大小的那个类型。若将一个float值与一个double值相乘,结果就是double;如将一个int和一个long值相加,则结果为long.显然,从大的数据类型造型到小的数据类型会造成数据的丢失.

3.2 执行控制
    if-else
    while
    do-while
    for
    switch

3.2.1 真和假
    所有条件语句都利用条件表达式的真或假来决定执行流程。条件表达式的一个例子是A==B。它用条件运算符“==”来判断A值是否等于B值。该表达式返回true或false.

3.2.2 if-else
    if(布尔表达式){}
    else{}

3.2.3 while
    while(布尔表达式)
    {}
    
3.2.4 do-while
    do{}
    while(布尔表达式)

3.2.5 for
    for(初始表达式;布尔表达式;步进)
    {}

3.2.6 中断和继续
    在任何循环语句的主体部分,亦可用break和continue控制循环的流程。其中,break用于强行退出循环,不执行循环中剩余的语句。而continue则停止执行当前的反复,然后退回循环起始,开始新的反复。
    java中没有实现goto,然而break和continue这两个关键字使用了和goto相同的机制:标签。
    例子:
    label1:
    for{
        for{
            if(){
                ...
                break label1;
                ...
            }
        }
    }

3.2.7 switch
    switch(整数选择因子){
    case 整数值1: 语句; break;
    case 整数值2: 语句; break;
    ...
    default: 语句;
    }
    
    在上面的定义中,大家会注意到每个 case 均以一个 break 结尾.这样可使执行流程跳转至 switch 主体的末尾.这是构建 switch 语句的一种传统方式,但 break 是可选的.若省略 break,会继续执行后面的 case 语句的代码,直到遇到一个 break 为止.尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善加利用.
    注意最后的 default 语句没有 break,因为执行流程已到了 break 的跳转目的地.当然,如果考虑到编程风格方面的原因,完全可以在 default 语句的末尾放置一个 break.

以上是关于thinking in java ----reading note 的主要内容,如果未能解决你的问题,请参考以下文章

thinking in java -----reading note

Thinking in Java Reading Note(9.接口)

Thinking in java Reading Note(8.多态)

Serializable与transient的联合使用:动态管理成员属性——《Thinking in Java》随笔033

Thinking in Java

Thinking in Java & Writing in Python