早上来,没什么事情,继续我的JAVA之旅;
越来越清晰了;
今天看电子书上的第三章,是控制程序流;
part1:基本概念;
一:赋值:
基本等同于C的赋值,但是有一点,在为对象“赋值”的时候,情况却发生了变化。
对一个对象进行操作时,我们真正操作的是对对象的引用。
所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方。
这意味着假若对对象使用“c=d”,那么 c 和 d 都指向原本只有 d指向的那个对象。
下面这个例子将向大家阐示这一点。
import com.bruceeckel.simpletest.*;
class Number {
int i;
}
public class Assignment {
static Test monitor = new Test();
public static void main(String[] args) {
Number n1 = new Number();
Number n2 = new Number();
n1.i = 9;
n2.i = 47;
System.out.println("1: n1.i: " + n1.i +
", n2.i: " + n2.i);
n1 = n2;
System.out.println("2: n1.i: " + n1.i +
", n2.i: " + n2.i);
n1.i = 27;
System.out.println("3: n1.i: " + n1.i +
", n2.i: " + n2.i);
monitor.expect(new String[] {
"1: n1.i: 9, n2.i: 47",
"2: n1.i: 47, n2.i: 47",
"3: n1.i: 27, n2.i: 27"
});
}
} ///:~
可以看到3,的输出是27,27,;
这种特殊的现象通常称作“别名现象(aliasing)”,是 Java 操作对象的一种基本方式。在这个例子中,如果你想避免别名应该怎么办呢?
你可以这样写:
n1.i = n2.i;
这样便可以保持两个对象彼此独立,而不是将 n1 和 n2 绑定到相同的对象。
二:算术操作符
1. 整数除法会直接去掉结果的小数位,而不是四舍五入的进位。
这章与C的算术操作符大体相同;
2.流程控制
return :return 关键字有两方面的用途:指定一个方法返回什么值(假设它没有 void 返回值),并立即返回那个值。
While:
while,do-while 和 for 用来控制循环,有时将它们划分为“迭代语句”。 语句会重复执行,除非用于控制的布尔表达式得到“假”的结果。while 循环的格式如下:
while(Boolean-expression)
statement
在循环刚开始时,会计算一次“布尔表达式”的值。而在语句的下一次迭代开始前也要重新计算一次。
do-While:
do-while 的格式如下:
do
statement
while(Boolean-expression);
while 和 do-while 唯一的区别就是 do-while 中的语句至少会执行一次,即便表达式第一次就被计算为 false。
而在 while 循环结构中,如果条件第一次就为 false,那么其中的语句根本不会执行。
for:
for 循环在第一次迭代之前要进行初始化。随后,它会进行条件测试,而且在每一次迭代结束时,
进行某种形式的“步进(Stepping)”。
for 循环的形式如下:
for(initialization; Boolean-expression; step)
statement
初始表达式,布尔表达式,或者步进运算,都可以为空。每次迭代前会测试布尔表达式。若获得的结果是 false,就会执行在 for 语句后面的代码。
每次迭代的末尾,会做一次步进运算。
对于象 C 那样的传统的过程型语言,要求所有变量都在一个块的开头定义。以便编译器在创建这个块的时候,可以为那些变量分配空间。
而在 Java 和 C++中,则可在整个块的范围内分散变量声明,在真正需要的地方才加以定义。
这样便可形成更自然的编码风格,也更易理解。
可以在一个 for 语句中定义多个变量,但它们必须具有同样的类型:
for(int i = 0, j = 1; i < 10 && j != 11; i++, j++)
Java 里唯一用到逗号操作符的地方就是 for 循环的控制表达式。
break 和 continue
在任何循环语句的主体部分,都可用 break 和 continue 控制循环的流程。其中,break
用于强行退出循环,不执行循环中剩余的语句。而 continue 则停止执行当前的迭代,然
后退回循环起始处,开始下一次迭代。
label:
“标签”是后面跟一个冒号的标识符,就象下面这样:
label1:
在 Java 中,标签起作用的唯一的地方是在迭代语句之前。
我们希望在其中嵌套另一个循环或者一个开关。这是由于 break 和 continue 关键字通常只中断当前循环,但若随同标签使用,它
们就会中断所有进行中的循环,转到标签所在的地方:
label1:
outer-iteration {
inner-iteration {
//...
break; // 1
//...
continue; // 2
//...
continue label1; // 3
//...
break label1; // 4
}
}
在状况 1 处,break 中断内部循环,回到外部循环。
在状况 2 处,continue 移回内部循环的起始处。
状况 3 处,continue label1 同时中断内部循环以及外部循环,直接转到label1 处。
随后,它实际是继续循环,但却从外部循环重新开始。
在状况 4 处,breakl abel1 也会中断所有循环,并回到 label1 处,但并不重新进入循环。
也就是说,它实际是完全中止了两个循环。
如果想在中断循环的同时退出方法,简单地用一个 return 即可。
(1) 一般的 continue 会退回最内层循环的开头(顶部),并继续执行。
(2) 带标签的 continue 会到达标签的位置,并重新进入紧接在那个标签后面的循环。
(3) 一般的 break 会中断并跳出当前循环。
(4) 带标签的 break 会中断并跳出标签所指的循环。
在 Java 里需要使用标签的唯一理由就是有循环嵌套,而且你想从不止一个嵌套中 break 或 continue。