Java学习笔记(四):流程控制

if语句

if判断语句比较简单,具体有下面的几种写法:

 1 int i = 0;
 2 // if 判断
 3 if (i == 0)
 4 {
 5     // to do something
 6 }
 7 // if else 判断
 8 if (i == 1)
 9 {
10     // to do something
11 }
12 else
13 {
14     // to do something
15 }
16 // if else if 判断
17 if (i == 1)
18 {
19     // to do something
20 }
21 else if(i == 2)
22 {
23     // to do something
24 }
25 else if(i == 3)
26 {
27     // to do something
28 }
29 else
30 {
31     // to do something
32 }

使用if实现条件编译

不同于C++和C#直接提供了条件编译功能,Java并没有提供相关的功能,但是我们可以巧妙的使用if来实现条件编译。

我们看一下下面的代码:

1 public class Hello {
2     public static void main(String[] args) {
3         if(false) {
4             System.out.println("Hello, world!");
5         }
6     }
7 }

由于Java编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。

我们反编译一下上面的程序,结果如下:

1 public class Hello
2 {
3   public static void main(String[] paramArrayOfString)
4   {
5   }
6 }

由此可见,我们可以通过这种方法来实现Java的条件编译:

 1 package org.hammerc.study;
 2
 3 public class Main
 4 {
 5     private final boolean DEBUG = true;
 6
 7     public static void main(String[] args)
 8     {
 9         if (DEBUG)
10         {
11             System.out.println("Hello, world!");
12         }
13     }
14 }

通过对DEBUG的修改来实现是否编译被if(DEBUG){}包含的代码。

3元操作符

我们看一下下面这个简单的条件判断代码:

1 int a = 100, b = 0;
2 if (a > 100)
3 {
4     b = 1;
5 }
6 else
7 {
8     b = 2;
9 }

很简单,但代码过于长了,通过3元操作符可以缩短代码,如下:

int a = 100, b = 0;
b = a > 100 ? 1 : 2;

效果与上面的代码一致。

switch语句

我们先来看一个简单的例子:

 1 int i = 0;
 2 switch (i)
 3 {
 4     case 0:
 5         System.out.println("0");
 6     case 1:
 7         System.out.println("1");
 8         break;
 9     case 2:
10         System.out.println("2");
11         break;
12     default:
13         System.out.println("3");
14 }

当i=0时,会输出"0"和"1",这是因为case 0下面没有break关键字,表示不退出switch语句,当i=1和i=2时,输出"1"和"2",其他的值时输出"3"。

switch支持的类型

JDK1.5之前

switch的case语句可以处理int,short,byte,char类型的值,但是不能处理long,String等类型。因为short,byte,char都会转换成int进行处理。

JDK1.5

新加入的枚举Enum类型也是可以作为case值的。

JDK1.7

添加了对String的支持,但是仍然不支持long,后面的升级中或许会添加支持。

循环结构

while

while()括号中的表达式只要为true就执行其包含的代码,执行完毕再检测表达式是否还为true,是则继续执行,不是则退出循环。

1 int i = 0;
2 while (i < 100)
3 {
4     System.out.println("i: " + i);
5     ++i;
6 }

会打印100条消息。

do while

和while相似,但是是先执行包含的代码后在检测while()括号中的表达式是否为true,是则再次执行,否则退出循环。

1 int i = 0;
2 do
3 {
4     System.out.println("i: " + i);
5     ++i;
6 }
7 while(i < 100);

也会打印100条消息。

for

for循环可以看做while循环的升级版,他把变量初始化,判断及每一次执行完毕要进行处理的代码都集中到一起了,如下:

for (int i = 0; i < 100; ++i)
{
    System.out.println("i: " + i);
}

效果和上面的while一致。

for each

JDK1.5中提供了另一种形式的for循环。借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。

我们先来看看使用老的方式遍历数组:

1 int[] arr = {1, 2, 3, 4, 5};
2 for (int i = 0; i < arr.length; i++)
3 {
4     int item = arr[i];
5     System.out.println(item);
6 }

使用for each来遍历数组:

1 int[] arr = {1, 2, 3, 4, 5};
2 for (int item : arr)
3 {
4     System.out.println(item);
5 }

使用老的方式来遍历集合:

1 String[] strings = {"A", "B", "C", "D", "E"};
2 Collection stringList = java.util.Arrays.asList(strings);
3 for (Iterator itr = stringList.iterator(); itr.hasNext();)
4 {
5     Object str = itr.next();
6     System.out.println(str);
7 }

使用for each来遍历集合:

1 String[] strings = {"A", "B", "C", "D", "E"};
2 Collection stringList = java.util.Arrays.asList(strings);
3 for (Object str : stringList)
4 {
5     System.out.println(str);
6 }

continue

continue用来退出当前的循环:

1 for (int i = 0; i < 100; i++)
2 {
3     if (i % 2 == 1)
4     {
5         continue;
6     }
7     System.out.println(i);
8 }

这个代码会过滤掉所用奇数,只打印偶数。

break

break用来退出整个循环:

1 for (int i = 0; i < 100; i++)
2 {
3     if (i == 50)
4     {
5         break;
6     }
7     System.out.println(i);
8 }

循环到第50次时退出循环。

label

我们来考虑一种情况,如下:

 1 for (int i = 0; i < 10; i++)
 2 {
 3     System.out.println("i: " + i);
 4     for (int j = 0; j < 10; j++)
 5     {
 6         System.out.println("j: " + j);
 7         if (j == 5)
 8         {
 9             break;
10         }
11     }
12 }

我们希望当j==5时退出两个循环,但是运行时可以发现,该break只能退出嵌套在内层的循环,这时就需要引入标签了,如下:

 1 label1:
 2 for (int i = 0; i < 10; i++)
 3 {
 4     System.out.println("i: " + i);
 5     for (int j = 0; j < 10; j++)
 6     {
 7         System.out.println("j: " + j);
 8         if (j == 5)
 9         {
10             break label1;
11         }
12     }
13 }

输出如下:

1 i: 0
2 j: 0
3 j: 1
4 j: 2
5 j: 3
6 j: 4
7 j: 5

此时的break实际上是退出了两个循环,可以看做外部循环的break,所以也不会重新进入循环了。

我们再看看continue:

 1 label1:
 2 for (int i = 0; i < 3; i++)
 3 {
 4     System.out.println("i: " + i);
 5     for (int j = 0; j < 3; j++)
 6     {
 7         System.out.println("j: " + j);
 8         if (j == 1)
 9         {
10             continue label1;
11         }
12     }
13 }

输出如下:

1 i: 0
2 j: 0
3 j: 1
4 i: 1
5 j: 0
6 j: 1
7 i: 2
8 j: 0
9 j: 1

此时的continue可以看做外部循环的continue,所以外部循环还是可以继续运行。

时间: 2024-12-19 13:42:33

Java学习笔记(四):流程控制的相关文章

【原】Java学习笔记005 - 流程控制

1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 // 程序的流程控制(流程结构):顺序结构.选择结构.循环结构 6 7 // 顺序结构:从上向下,顺序执行 8 System.out.println("出生..."); 9 System.out.println("享受人生..."); 10 System.out.print

Java学习笔记五——流程控制

分支结构 Java提供了两种常见的分支控制结构:if语句和switch语句. if语句 if语句使用布尔值或布尔表达式(表达式结果为布尔值),if语句有3中形式: 第一种形式: if (5 > 3) { System.out.println("5 > 3"); } 第二种形式: if (5 > 3) { System.out.println("5 > 3"); } else{ System.out.println("5 < 3

【原】Java学习笔记007 - 流程控制

1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 // for循环 6 // 格式 7 // for (int i = 初始值; i < value; i++) { 8 // 9 // } 10 // 口诀:左初值.右步长.条件在中间.处理在内部 11 // 1.左初值:声明一个变量并给变量赋值 12 // 2.右步长:控制左边声明的变量的变化幅度,为

No2. 学习笔记_流程控制

1 import java.util.Scanner; 2 public class HelloForWhile { 3 4 /** 5 * 文档注释,程序名称:HelloForWhile 流程控制 开发时间:2016-03-07 作者:嘿嘿 6 * */ 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 System.out.println("test"); 10 int

python学习笔记3—流程控制if、for、while

流程控制if if 语句 if expression: statement(s) else else语句: if 语句,else语句 if expression: statement(s) else: statement(s) elif语句: if expression1: statement1(s) elif expression2(s): statements2(s) else: statement2(s) 注:Python使用缩进作为其语法分组的方法,建议使用4个空格 逻辑值(bool)包

JavaScript学习笔记——javascript流程控制

javascript流程控制流程:就是程序代码的执行顺序.流程控制:通过规定的语句让程序代码有条件的按照一定的方式执行. 一.顺序结构 按照书写顺序来执行,是程序中最基本的流程结构. 二.选择结构(分支结构.条件结构) 根据给定的条件有选择的执行形相应的语句. (1) if else if else 1.单路分支 //条件可以是表达式也可以是任何的数据类型 //大括号会把他里面的代码当作一个整体来运行,如果只有一条语句,可以省略大括号 if(条件){ 条件成立执行的语句 } 2.双路分支 if(

java学习笔记四:static的几个角落及小谈多态

最近有点事情,没有及时更新笔记,学习不可弃,总结一下最近的学习,其中重点是static的一些应用,多态是一种设计理念,了解较容易,想如火纯清的确不是一件容易的事情. 对于static,主要有两点是我所学习的. 1.首先简单的介绍一下static的定义.static是静态的意思,就是说这个类变量或者类方法不需要实例化就可以使用.使用static的变量是类变量,也成为静态域(static field).这些是static的基本语义,了解了这些,继续向下看. java核心技术(卷一)对于静态有这样一段

Java学习笔记四(代码块 )

1 代码块的分类:java中的代码块是指使用{}括起来的一段代码,根据位置不同可以分为四种: 普通代码块 构造快 静态代码块 同步代码块 今天主要学习前三种代码块,同步代码块在学习到多线程部分的时候再加学习. 2 普通代码块:直接定义在方法中的代码块,如下: public class CodeSpace { public static void main(String args[]){ { int x = 30; System.out.println("普通代码块x="+x); } /

JAVA学习笔记(四十七)- 事件监听

定义ActionListener接口的实现类实现事件监听 import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; /* * 事件监听 */ public class Te

JAVA学习笔记(四十九)- Swing相关组件

JFrame组件 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; /* * Swing是在AWT基础上的扩展 * javax.swing包及其扩展包,组件的命名多以J开关 * * JFrame组件 */ public class Test08 { public static void main(String[] args) { JFrame frame=new JFrame("我的窗体&qu