控制流程

与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程。

块作用域

我们首先要了解块(block)的概念。

块是指由若干条Java语句组成的语句,并用一对大括号括起来。块确定了变量的作用域。一个块可以嵌套在另一个快中。下面就是嵌套在main方法块中的一个块。

public static void main(String[] args) {
int n = 1;
{
int k = 3;
System.out.println(k); // success
} // k只在这个块中被定义
System.out.println(k); // error
}

但是,不能在嵌套的两个块中声明同名的变量,否则就会有错误,无法通过编译:

public static void main(String[] args) {
int n = 1;
{
int k = 3;
int n = 2;
}
}

这里已经在外面定义了n,就不能再嵌套的块中再定义n了。

条件语句

在Java中,条件语句的形式为

if (condition) statement

这里的条件必须用小括号括起来。剩下的跟其他语言语法几乎一直,直接看以下例子

import java.util.Scanner;

public class SecondSample {
public static void main(String[] args) {
/*
* 根据销售额来评价你的表现,奖励你不同的金额
* */
// 创建输入对象
Scanner in = new Scanner(System.in);
System.out.println("请输入你的销售额");
// 在控制台输入你的销售额
int yourSales = in.nextInt();
// 定义一个目标
int target = 1000;
// 初始化表现
String performance;
// 初始化奖金
int bonus;
if (yourSales >= 2 * target) {
performance = "优秀";
bonus = 1000;
System.out.printf("你的表现为%s,奖励你%d元%n", performance, bonus);
} else if (yourSales >= 1.5 * target) {
performance = "良好";
bonus = 500;
System.out.printf("你的表现为%s,奖励你%d元", performance, bonus);
} else if (yourSales >= target) {
performance = "及格";
bonus = 100;
System.out.printf("你的表现为%s,奖励你%d元", performance, bonus);
} else {
System.out.println("You 're fired");
}
}
}

while循环

当条件为true时,while循环执行下一条语句。一般形式如下:

while (condition) statement

我们设定一个程序,计算需要多长时间才能够存储一定数量的退休金,假定每年存入相同数量的金额,而且利率是固定的。

import java.util.Scanner;

public class ThirdSample {
public static void main(String[] args) {
/*
* 计算需要多长时间才能够存储一定数量的退休金
* */
Scanner in = new Scanner(System.in); System.out.println("你需要多少退休金?");
double goal = in.nextDouble(); System.out.println("你每年将增加多少钱?");
double payment = in.nextDouble(); System.out.println("利率是多少:");
double interestRate = in.nextDouble(); double balance = 0;
int years = 0; // 未达到目标时更新帐户余额
while (balance < goal) {
// 加上今年的付款和利息
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
years++;
}
System.out.printf("你可以在%d年内退休", years);
}
}

while循环是先判断后执行,如果条件不满足则永远是false,那么可能永远不会执行,如果我们想无论条件是否为true,我们都要先执行一条语句,那么在Java中提供了do..while...这种循环形式。

do statement while (condition)

下面的例子中,首先计算退休账户中的新的余额,然后再询问是否打算退休:

public class ThirdSample {
public static void main(String[] args) {
Scanner in = new Scanner(System.in); System.out.println("你每年将增加多少钱?");
double payment = in.nextDouble(); System.out.println("利率是多少?");
double interestRate = in.nextDouble(); double balance = 0;
int year = 0;
String input;
do {
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
year++;
System.out.printf("%d年后,你的余额为%,.2f%n", year, balance);
System.out.println("准备退休?(Y/N)");
input = in.next();
}
while (input.equals("N"));
}
}

for确定循环

  for循环语句是支持迭代的一种通用结构,由一个计数器或类似的变量控制迭代次数,每次迭代后这个变量将会更新。

for (int i=1; i<=10; i++){
System.out.println(i);
}

  for语句的第1部分通常是对计数器初始化;第2部分给出每次新一轮循环执行前要检测的循环条件;第3部分指定如何更新计数器。

与C++一样,尽管Java允许在for循环的各个部分放置任何表达式,但有一条不成文的规则:for语句的3个部分应该对同一个计数器变量进行初始化、检测和更新。若不遵守这一规则,编写的循环常常晦涩难懂。

注意:在循环中,检测两个浮点数是否相等需要格外小心。for (double x=0;x!=10;x+=0.1),这条语句永远不会结束。由于舍入的误差,永远达不到精确的最终值。因为0.1无法精确地用二进制表示,所以,x将从9.999 999 999 999 98跳到10.099 999 999 999 98。

多重选择:switch语句

在处理多个选项时,使用if/else语句就显得有些笨拙。Java有一个与C/C++完全一样的switch语句。例如,下面包含4个选项的菜单系统

public class FifthSample {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Select an option (1, 2, 3, 4)");
int choice = in.nextInt();
switch (choice)
{
case 1:
System.out.println("我选择了1");
break;
case 2:
System.out.println("我选择了2");
break;
case 3:
System.out.println("我选择了3");
break;
case 4:
System.out.println("我选择了4");
break;
default:
System.out.println("默认选择");
break;
}
}
}

switch语句将从与选项值相匹配的case标签开始执行,直到遇到break语句,或者执行到switch语句的结束处为止。如果没有相匹配的case标签,而有default子句,就执行这个子句。

注意:强烈不建议使用switch语句,最好永远不要使用,因为如果在case分支语句的末尾没有break语句,那么就会接着执行下一个case分支语句。这种情况跟相当危险,常常会引发错误。

 

case的标签可以是:

  • 类型为char、byte、short或int常量表达式
  • 枚举常量
  • 从Java7开始,case标签还可以是字符串字面量

最新文章

  1. ImageView的常用属性
  2. sql 多行合一行
  3. jQuery演示10种不同的切换图片列表动画效果
  4. 如何预览github中的html页面
  5. Uva 679 Dropping Balls
  6. Android LayoutParams简介
  7. ubuntu下读取数据库中文乱码解决
  8. Magento控制器
  9. Ajax的利弊
  10. Quartz任务调度快速入门
  11. Jquery_Ajax文件上传
  12. Meld Diff for windows 安装和配置
  13. Android调用第三方so
  14. 阶段小项目2:显示bin格式图片
  15. nodejs高并发大流量的设计实现,控制并发的三种方法
  16. FortiGate防火墙HA下联堆叠交换机
  17. elasticsearch _script 脚本排序
  18. Jmeter(十九) Md5加密操作之-------BeanShell PreProcessor(转载)
  19. 【C++】cout未刷新缓冲区仍会输出的问题
  20. NumPy 字符串函数

热门文章

  1. [STL] vector 可变数组
  2. windodws pyusb hub端口对应连接的usb设备
  3. Jenkins Build step &#39;Execute shell&#39; marked build as failure
  4. [题解] 春荔(cut) | 贪心
  5. 拯救一切强迫症 - 读《编写可维护的 JavaScript》(一)
  6. 什么是Docker容器?(全面了解使用)
  7. OpenStack 安装 Keystone
  8. C#语言中的类型转换方法(unfinished)
  9. SQL中把汉字转换拼音码
  10. 渗透测试之sql注入点查询