CH03 流程控制和数组

版权声明:@Abby-YTJ https://blog.csdn.net/weixin_43564773/article/details/85736805

3.1 分支结构

Java提供两种分支控制结构:if语句和switch语句

3.1.1 if条件语句

  • 单分支结构
if (条件)
{
    <语句块>
}
  • 二分支结构
if (条件)
{
    <语句块1>
}
else
{
    <语句块2>
}
  • 多分支结构
if (条件1)
{
    <语句块1>
}
else if(条件2)
{
    <语句块2>
}
    ...
else
{
    <语句块2>
}

3.1.2 switch分支语句

  • switch语句后面的控制表达式的数据类型只能是byte、short、char、int四种整数类型,枚举类型和java.lang.String类型,不能是boolean类型
switch (expression)
{
    case condition1:
    {
        statement(s)
        break;
    }
    case condition2:
    {
        statement(s)
        break;
    }
    ...
    case conditionN:
    {
        statement(s)
        break;
    }
    default:
    {
        statement(s)
    }
}

3.2 循环结构

  • 循环结构一般包含以下四个部分
    • 初始化语句
    • 循环条件
    • 循环体
    • 迭代语句

3.2.1 while循环语句

[init_statement]
while(test_expression)
{
    statemment;
    [iteration_statement]
}

例:Retirement.java

import java.util.Scanner;
public class Retirement {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("How much money do you need to retire?");
		double goal = in.nextDouble();
		System.out.print("How much money will you contribute every year? ");
		double payment = in.nextDouble();
		System.out.print("Interest rate in %: ");
		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.println("You can retire in " + years + " years.");
	}
}

3.2.2 do while循环语句

[init_statement]
do
{
    statement;
    [iteration_statement]
}while(test_expression);

例:Retirement2.java

import java.util.Scanner;
public class Retirement2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("How much money do you need to retire?");
		double goal = in.nextDouble();
		System.out.print("How much money will you contribute every year? ");
		double payment = in.nextDouble();
		System.out.print("Interest rate in %: ");
		double interestRate = in.nextDouble();
		double balance = 0;
		int year = 0;
		String input;
		// update account balance while user isn't ready to retire
		do
		{
			// add this year's payment and interest
			balance += payment;
			double interest = balance * interestRate / 100;
			balance += interest;
			year++;
			System.out.printf("After year %d, your balance is %,.2f%n", year, balance);
			// ask if ready to retire and get input
			System.out.print("Ready to retire?(Y/N) ");
			input = in.next();
		}
		while(input.equals("N"));
	}
}

3.2.3 for循环

for ([init_statement];[test_expression];[iteration_statement])
{
    statement;
}

例:LotteryOdds.java

import java.util.Scanner;
public class LotteryOdds {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("How many numbers do you need to draw? ");
		int k = in.nextInt();
		System.out.print("What is the highest number you can draw? ");
		int n = in.nextInt();
		int lotteryOdds = 1;
		for (int i = 1; i <= k; i++)
			lotteryOdds = lotteryOdds * ( n - i + 1) / i;
		System.out.println("Your odds are 1 in " + lotteryOdds + ". Good luck!");
	}
}

3.3 控制循环结构

3.3.1 使用break结束循环

  • break用于完全结束一个循环,跳出循环体
    例:BreakTest.java
public class BreakTest {
	public static void main(String[] args) {
		for (int i = 0; i < 10; i++)
		{
			System.out.println("i的值是" + i);
			if (i == 2)
			{
				break;
			}
		}
	}
}

运行结果:

i的值是0
i的值是1
i的值是2
  • break语句不仅可以结束其所在的循环,还可以直接结束其外层循环。此时需要在break后紧跟一个标签,用于标识一个外层循环。
    例:BreakTest2.java
public class BraekTest2 {
	public static void main(String[] args) {
		//外层循环,outer作为标识符
		outer:
			for (int i = 0; i < 5; i++)
			{
				// 内层循环
				for (int j = 0; j<3; j++)
				{
					System.out.println("i的值为:" + i + " j的值为:" + j);
					if (j == 1)
					{
						// 跳出outer标签所标识的循环
						break outer;
					}
				}
			}
	}
}

运行结果:

i的值为:0 j的值为:0
i的值为:0 j的值为:1

3.3.2 使用continue忽略本次循环剩下语句

  • continue忽略本次循环剩下语句,接着开始下一次循环,并不会终止循环。
    例:ContinueTest.java
public class ContinueTest {
	public static void main(String[] args) {
		for(int i = 0; i < 3; i++)
		{
			System.out.println("i的值是" + i);
			if (i == 1)
			{
				// 忽略本次循环的剩下语句
				continue;
			}
			System.out.println("continue后的输出语句");
		}
	}
}

运行结果

i的值是0
continue后的输出语句
i的值是1
i的值是2
continue后的输出语句
  • continue后也可以紧跟一个标签,用于直接跳过标签所标识循环的当次循环的剩下语句,重新开始下一次循环
    例: ContinueTest2.java
public class ContinueTest2 {
	public static void main(String[] args) {
		// 外层循环
		outer:
			for (int i = 0; i < 5; i++)
			{
				// 内层循环
				for(int j = 0; j < 3; j++)
				{
					System.out.println("i的值为:" + i + " j的值为:" + j);
					if (j == 1)
					{
						// 忽略outer标签所指定的循环中本次循环所剩下语句
						continue outer;
					}
				}
			}
	}
}

运行结果:

i的值为:0 j的值为:0
i的值为:0 j的值为:1
i的值为:1 j的值为:0
i的值为:1 j的值为:1
i的值为:2 j的值为:0
i的值为:2 j的值为:1
i的值为:3 j的值为:0
i的值为:3 j的值为:1
i的值为:4 j的值为:0
i的值为:4 j的值为:1

3.3.3 使用return结束一个方法

  • 当一个方法执行到return语句时,这个方法将被结束
  • 与continue和break不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。
    例:ReturnTest.java
public class ReturnTest {
	public static void main(String[] args) {
		for(int i = 0; i < 3; i++)
		{
			System.out.println("i的值是" + i);
			if (i == 1)
			{
				return;
			}
			System.out.println("return后的输出语句");
		}
	}
}

运行结果:

i的值是0
return后的输出语句
i的值是1

3.4 数组类型

3.4.1 理解数组

  • Java的数组要求所有的数组元素具有相同的数据类型。
  • 数组的长度不可改变
  • Java的数组既可以存储基本类型的数据,也可以存储引用类型的数据(数组本身是一种引用类型)

3.4.2 定义数组

type[] arrayName;

3.4.3 数组的初始化

  • Java语言中数组必须先初始化,才可以使用。初始化指的是为数组的数组怨妇分配内存空间,并为每个数组元素赋初值。
  • 数组的初始化有如下两种形式:
    • 静态初始化
    • 动态初始化

静态初始化

arrayName = new type[] {element1, element2, element3, element4...};
  • 数组定义和初始化可以同时完成
type[] arrayName = {element1, element2, element3,...};

动态初始化

  • 只指定数组的长度,由系统为每个数组元素指定初始值。
arrayName = new type[length];
  • 数组定义和初始化同时完成
type[] arrayName = new type[length];

3.4.4 foreach循环

  • foreach循环可以遍历数组和集合,无须根据索引来访问数组元素和集合元素
for ( type variableName : array | collection)
{
    statement// variableName自动迭代访问每个元素...
}

例:ForEachTest.java

public class ForEachTest {
	public static void main(String[] args) {
		String[] books = {"Core Java I","Core Java II","Python"};
		// 使用foreach循环来遍历数组元素
		// 其中book元素将会自动迭代每个数组元素
		for (String book : books)
		{
			System.out.println(book);
		}
	}
}

运行结果

Core Java I
Core Java II
Python
  • 注意:使用foreach循环迭代数组元素时,并不能改变数组元素的值,因此不要对foreach的循环变量进行赋值。

3.5 深入数组

3.5.1 基本类型数组的初始化

  • 对于基本类型数组,初始化时,先为该数组分配内存空间,然后直接将数组元素的值存入对应数组元素中。
    例:PrimitiveArrayTest.java
public class PrimitiveArrayTest {
	public static void main(String[] args) {
		// 定义一个int[]类型的数组变量
		int[] iArr;
		// 动态初始化数组,数组长度为5
		iArr = new int[5];
		// 采用循环方式为每个数组元素赋值
		for (int i = 0; i < iArr.length; i++)
		{
			iArr[i] = i + 10;
			System.out.print(iArr[i] + " ");
		}
	}
}

3.5.2 引用类型数组的初始化

  • 引用类型数组的元素是引用,指向另一块内存,这块内存中存储了有效数据。
    例:ReferenceArrayTest.java
public class Person {
	public int age;
	public double height;
	// 定义一个info方法
	public void info()
	{
		System.out.println("我的年龄是:" + age
				+ ", 我的身高是:" + height);
	}
}
public class ReferenceArrayTest {
	public static void main(String[] args) {
		// 定义一个students数组变量,其类型是Person[]
		Person[] students;
		// 执行动态初始化
		students = new Person[2];
		// 创建一个Person实例,并把这个Person实例赋给Yuan变量
		Person yuan = new Person();
		// 为Yuan所引用的Person对象的age、height赋值
		yuan.age = 19;
		yuan.height = 183;
		// 创建一个Person实例,并把这个Person实例赋给Ma变量
		Person ma = new Person();
		// 为Ma素所引用的Person对象的age、height赋值
		ma.age = 55;
		ma.height = 162;
		// 将yuan变量的值赋给第一个数组元素
		students[0] = yuan;
		// 将ma变量的值赋给第二个数组元素
		students[1] = ma;
		yuan.info();
        // yuan和students[0]指向同一个内存区
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43564773/article/details/85736805