跳至主要內容

Java

LincZero大约 3 分钟

Java

目录

结构化编程

Java的控制流程结构与C和C++的控制流程结构一样,只有很少的例外情况。

没有goto语句,但break语句可以带标签,可以利用它实现从内层循环跳出的目的(这种情况C语言采用goto语句实现)。

另外,还有一种变形的for循环,在C或C++中没有这类循环(C++11有)。它有点类似于C#中的foreach循环。

块(block)作用域

(有时称为复合语句)

{}

与C/C++、js不同:嵌套块重定义变量

  • C/C++、js:可以在嵌套的块中重定义一个变量。在内层定义的变量会覆盖在外层定义的变量。
  • Java:认为这样有可能会导致程序设计错误,因此在Java中不允许这样做。

条件语句

if、else if、else

if (condition) statement;		// statement可为语句块 {}

if (condition1) statement1;
else if(condition2) statement2;
else statement3;

switch语句(多重选择)

Java有一个与C/C++完全一样的switch语句

注意项

  • 有可能触发多个case分支。如果在case分支语句的末尾没有break语句,那么就会接着执行下一个case分支语句。这种情况相当危险,常常会引发错误。为此,我们在程序中从不使用switch语句。

  • 若一定要用,可以在编译时加上-Xlint: fallthrough选项,如javac -Xlint:fallthrough Test.java 这样的话,如果某分支末尾缺少break语句,编译器会给出警告消息

  • 当在switch语句中使用枚举常量时,不必在每个标签中指明枚举名,可以由switch的表达式值确定。例如

    Size sz = ...;
    switch(sz)
    {
        case SMALL:	// no need to use Size.SMALL
            //...
            break;
    }
    

Break 中断控制流程语句

循环

while、do while 循环

while (condition) statement;	// 首先检测循环条件
do statement while (condition);	// 首先执行,再检测循环条件

for循环

for (int i=1; i<=10; i++) statement;	// 先初始化 > 判断 > 执行 > 判断(循环)

注意项:

  • 不成文的规则:for语句的3个部分应该对同一个计数器变量进行初始化、检测和更新。否则编写的循环常常晦涩难懂。
  • 特别指出,如果在for语句内部定义一个变量(int i),这个变量就不能在循环体之外使用(java不能在块中重定义变量) 当然可以在各自独立的不同for循环中定义同名的变量 如果希望在for循环体之外使用循环计数器的最终值,就要确保这个变量在循环语句的前面且在外部声明

Break 中断控制流程语句

[省略],与用于退出switch语句的break语句一样

注意项:对于任何使用break语句的代码都需要检测循环是正常结束,还是由break跳出

跳出多重嵌套

与C/C++不同:跳出多重嵌套

  • Java还提供了一种带标签的break语句,用于跳出多重嵌套的循环语句。有时候,在嵌套很深的循环语句中会发生一些不可预料的事情。

    标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号

    事实上,可以将标签应用到任何语句中,甚至可以应用到if语句或者块语句中。(可能可以用来模拟goto语句,但不建议那样做)

    read_data:
    while(...)
    {
        for(...){
            break read_data;	// break out of read_data loop
        }
    }
    

continue 中断控制流程语句

continue语句越过了当前循环体的剩余部分,立刻跳到循环首部

for each循环(通用for循环)

与C/C++不同:高级循环

  • Java(Java SE 5.0新增)

    for (variable:collection) statement;
    for (int element : a)
        System.out.println(element);
    

三目运算符

  • C、Java、Js:
    • 条件 ? true_exp : false_exp
  • Python:
    • true_exp if 条件 else false_exp