顺序结构
Java语言的顺序结构和C语言一样,都是从上都下,一行一行顺序执行,我们来看一个例子来看一下:
public class Test {
public static void main(String[] args) {
System.out.println("hello, first statement!");
System.out.println("hello, second statement!");
System.out.println("hello, third statement!");
}
}
运行结果如下:
分支结构
if语句
if语句的用法如下:
if (布尔表达式) {
// 布尔表达式为真时执行代码
}
例子如下:
public class Test {
public static void main(String[] args) {
if (true) {
System.out.println("hello, world!");
}
}
}
if (布尔表达式) {
// 布尔表达式为真时执行代码
} else {
// 布尔表达式为假时执行代码
}
例子如下:
public class Test {
public static void main(String[] args) {
if (false) {
System.out.println("hello, true!");
} else {
System.out.println("hello, false!");
}
}
}
if (布尔表达式1) {
// 布尔表达式1为真时执行
} else if (布尔表达式2) {
// 布尔表达式2为真时执行
} else {
// 布尔表达式1和布尔表达式2都为假的时候执行
}
来个例子:判断一个数是正数还是负数:
public class Test {
public static void main(String[] args) {
int num = 10;
if (num > 0) {
System.out.println("正数");
} else if (num < 0) {
System.out.println("负数");
} else {
System.out.println("零");
}
}
}
最后,统一来看几个问题,加深理解:
问题一:判断一个数是正数还是负数。
public class Test {
public static void main(String[] args) {
int num = 10;
if (num % 2 == 0) {
System.out.println(num + "是偶数");
} else {
System.out.println(num + "是奇数");
}
}
}
问题二:判断某一年是否是闰年。
public class Test {
public static void main(String[] args) {
int year = 2000;
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
System.out.println(year + "是闰年");
} else {
System.out.println(year + "不是闰年");
}
}
}
注意:和C语言不同的是,Java的if的括号中必须是布尔表达式,否则就会报错;而在C语言中无所谓,因为C语言中0为假,非0为真,来看一个例子:
public class Test {
public static void main(String[] args) {
int num = 10;
if (num) {
System.out.println(num + "非零");
} else {
System.out.println(num + "为零");
}
}
}
switch语句
我们知道,C语言中的switch语句中只能使用整型数据,而在Java中不仅可以使用整型数据,还可以使用字符和字符串。
基本语法如下:
switch (整数 | 枚举 | 字符 | 字符串) {
case 内容1: {
内容满足时执行语句;
break;
}
case 内容2: {
内容满足时执行语句;
break;
}
...
default: {
内容不满足时执行语句;
break;
}
}
我们来一个例子理解一下,还是经典的星期问题。根据数字,输出是星期几。
public class Test {
public static void main(String[] args) {
int day = 5;
switch (day) {
case 1: {
System.out.println("星期一");
break;
}
case 2: {
System.out.println("星期二");
break;
}
case 3: {
System.out.println("星期三");
break;
}
case 4: {
System.out.println("星期四");
break;
}
case 5: {
System.out.println("星期五");
break;
}
case 6: {
System.out.println("星期六");
break;
}
case 7: {
System.out.println("星期天");
break;
}
default: {
System.out.println("输入有误");
break;
}
}
}
}
注意,不要遗漏break,否则会顺序执行下去,直到遇到break,下面来个例子看下效果:
public class Test {
public static void main(String[] args) {
int day = 5;
switch (day) {
case 1: {
System.out.println("星期一");
}
case 2: {
System.out.println("星期二");
}
case 3: {
System.out.println("星期三");
}
case 4: {
System.out.println("星期四");
}
case 5: {
System.out.println("星期五");
}
case 6: {
System.out.println("星期六");
}
case 7: {
System.out.println("星期天");
}
default: {
System.out.println("输入有误");
}
}
}
}
不推荐使用switch:
- break容易遗漏;
- switch中不能就收浮点数等,接收的数据类型优先;
- 不能表达更复杂的条件;
- switch的嵌套结构很丑。
- switch能够完成的工作,if else都能完成,并且也没有更复杂。
循环结构
while循环
基本语法如下:
while (循环条件) {
// 循环条件为true时,执行循环语句;否则结束循环
循环语句;
}
直接来看几个问题:
问题一:计算5的阶乘。
public class Test {
public static void main(String[] args) {
int num = 1;
int factor = 1;
while (num <= 5) {
factor *= num;
++num;
}
System.out.println("factor = " + factor);
}
}
for循环
基本语法如下:
// 表达式1:用于初始化循环变量;
// 表达式2:循环条件;
// 表达式3:更新循环变量。
for (表达式1; 表达式2; 表达式3) {
循环体;
}
同样的,我们使用for循环来计算一下5的阶乘。
public class Test {
public static void main(String[] args) {
int factor = 1;
for (int i = 1; i <= 5; ++i) {
factor *= i;
}
System.out.println("factor = " + factor);
}
}
do while循环
和C语言中的do while循环一样,先执行循环语句,再判定循环条件。
基本语法格式如下:
do {
循环语句;
} while (循环条件);
同样的,使用do while计算5的阶乘。
public class Test {
public static void main(String[] args) {
int factor = 1;
int num = 1;
do {
factor *= num;
++num;
} while (num <= 5);
System.out.println(factor);
}
}
break和continue
- break:跳出当前循环。
- continue:跳出本次循环,直接进入下一次循环。
我们来看一个例子来体会一下break的作用,找到1~100中第一个3的倍数。
public class Test {
public static void main(String[] args) {
for (int num = 1; num <= 100; ++num) {
if (num % 3 == 0) {
System.out.println(num);
break;
}
}
}
}
再来一个例子来替换一下continue的作用,打印1~100中所有3的倍数。
public class Test {
public static void main(String[] args) {
for (int num = 1; num <= 100; ++num) {
if (num % 3 != 0) {
continue;
}
System.out.print(num + " ");
}
}
}
输入输出
输出
System.out.println:自带换行的输出。
public class Test {
public static void main(String[] args) {
System.out.println("hello, world!");
}
}
System.out.print:不带换行的输出。
public class Test {
public static void main(String[] args) {
System.out.print("hello, world!");
}
}
格式化输出,和C语言中用法类似。
public class Test {
public static void main(String[] args) {
System.out.printf("%s", "hello, world!");
}
}
输入
我们可以使用System.in.read读取一个字符,来看代码。
public class Test {
public static void main(String[] args) {
System.out.println("请输入一个字符: ");
char c = (char)System.in.read();
System.out.println("输入的字符是: " + c);
}
}
从上述报错信息可以看出,使用System.in.read()必须使用异常对其进行捕获,我们将代码修改一下。
import java.io.IOException;
public class Test {
public static void main(String[] args) {
try {
System.out.println("请输入一个字符: ");
char c = (char)System.in.read();
System.out.println("输入的字符是: " + c);
} catch (IOException e) {
System.out.println("IOException");
}
}
}
可以看到,上述的输入使用是非常麻烦的,下面我们介绍一种更简单好用的方式。
使用Scanner输入。
我们直接来看一段代码:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串: ");
String str = sc.nextLine();
System.out.println("请输入一个整数: ");
int numInt = sc.nextInt();
System.out.println("请输入一个浮点数: ");
double numDouble = sc.nextDouble();
System.out.println("您的所有输入如下: ");
System.out.println("str: " + str + " numInt: " +
numInt + " numDouble: " + numDouble);
sc.close();
}
}
注意:Scanner对象使用完毕,一定要调用close()方法,否则会造成资源泄漏。
如果调用的是nextDouble()方法,但是输入的不是Double类型数据,会抛出异常,只要类型不匹配都是如此,下面来看一段代码:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个浮点数: ");
double num = sc.nextDouble();
System.out.println("输入的浮点数是: " + num);
sc.close();
}
}
最后再来一个例子,循环输入N(N未知)个数,统计它们的和:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double sum = 0.0;
// 当sc.hasNextDouble()遇到EOF(文件结束标志)就会终止
// Windows下输入EOF为Ctrl + z,Mac/Linux下为Ctrl + d
while (sc.hasNextDouble()) {
double temp = sc.nextDouble();
sum += temp;
}
System.out.println("The sum is: " + sum);
}
}