1、输入/输出
输出
我们总是使用System.out.println()
来向屏幕输出一些内容。
println是print line的缩写,表示输出并换行。因此,如果输出后不想换行,可以用print()
。
格式化输出
格式化输出使用System.out.printf()
,通过使用占位符%?
,printf()
可以把后面的参数格式化成指定格式。
占位符 | 说明 |
---|---|
%d | 格式化输出整数 |
%x | 格式化输出十六进制整数 |
%f | 格式化输出浮点数 |
%e | 格式化输出科学计数法表示的浮点数 |
%s | 格式化字符串 |
注意:由于%
表示占位符,因此,连续两个%%
表示一个%
字符本身。
输入
- 首先,我们通过
import
语句导入java.util.Scanner
,import
是导入某个类的语句,必须放到Java源代码的开头,后面我们在Java的package中会详细讲解如何使用import
。 - 然后,创建
Scanner
对象并传入System.in
。System.out
代表标准输出流,而System.in
代表标准输入流。直接使用System.in
读取用户输入虽然是可以的,但需要更复杂的代码,而通过Scanner
就可以简化后续的代码。 - 有了
Scanner
对象后,要读取用户输入的字符串,使用scanner.nextLine()
,要读取用户输入的整数,使用scanner.nextInt()
。Scanner
会自动转换数据类型,因此不必手动转换。
练习
2、if判断语句
if
语句的基本语法是:
if (条件) {
// 语句块-条件满足时执行
}
if
语句还可以编写一个else { ... }
,当条件判断为false
时,将执行else
的语句块。
还可以用多个if ... else if ...
串联。
if (条件1) {
// 语句块 - 条件1满足时执行
} else if (条件2){
//语句块 - 条件2满足时执行
} else {
//语句块 - 条件不满足时执行
}
- 根据
if
的计算结果(true
还是false
),JVM决定是否执行if
语句块(即花括号{}
包含的所有语句)。 - 当
if
语句块只有一行语句时,可以省略花括号{}
. - 在串联使用多个
if
时,要特别注意判断顺序。原因是if
语句从上到下执行时,先判断条件1成功后,后续else不再执行,因此,条件2没有机会执行了。
判断浮点数相等
- 浮点数在计算机中常常无法精确表示,并且计算可能出现误差,因此,判断浮点数相等用
==
判断不靠谱,正确的方法是利用差值小于某个临界值
来判断。
判断引用类型相等
- 判断值类型的变量是否相等,可以使用
==
运算符。 ==
表示“引用是否相等”,或者说,是否指向同一个对象。- 要判断引用类型的变量内容是否相等,必须使用
equals()
方法。
注意:执行语句s1.equals(s2)
时,如果变量s1为null,会报’NullPointerException‘。
要避免NullPointerException错误,可以利用短路运算符&&
。
public class Main {
public static void main(String[] args) {
String s1 = null;
if (s1 != null && s1.equals("hello")) {
System.out.println("hello");
}
}
}
请用if ... else编写一个程序,用于计算体质指数BMI,并打印结果。
BMI = 体重(kg)除以身高(m)的平方
BMI结果:
过轻:低于18.5
正常:18.5-25
过重:25-28
肥胖:28-32
非常肥胖:高于32
3、switch多重选择
switch
语句根据switch (表达式)
计算的结果,跳转到匹配的case
结果,然后继续执行后续语句,直到遇到break
结束执行。
- 如果值没有匹配到任何
case
,那么,switch
语句不会执行任何语句。这时,可以给switch
语句加一个default
,当没有匹配到任何case
时,执行default
。
switch(结果) {
case result1 :
语句1;
break;
case result2 :
语句2;
break;
case result3 :
case result4:
语句3;
break;
default:
语句4;
break;
}
- 使用
switch
时,注意case
语句并没有花括号{}
,而且,case
语句具有“穿透性”,漏写break
将导致意想不到的结果。如果匹配到case 2开始,后续语句将全部执行,直到遇到break语句。因此,任何时候都不要忘记写break。 - 如果有几个
case
语句执行的是同一组语句块,可以如case3、case4这么写。 switch
语句还可以匹配字符串。字符串匹配时,是比较“内容相等”。- 从Java 12开始,
switch
语句升级为更简洁的表达式语法,使用类似模式匹配(Pattern Matching
)的方法,保证只有一种路径会被执行,并且不需要break
语句。
switch (num){
case 值1 -> 语句1;
case 值2 -> 语句2;
case 值3 -> 语句3;
default -> 语句4;
}
- 注意:新语法使用
->
,如果有多条语句,需要用{}
括起来。不要写break
语句,因为新语法只会执行匹配的语句,没有穿透效应。 - 很多时候,我们还可能用
switch
语句给某个变量赋值。使用新的switch
语法,不但不需要break
,还可以直接返回值。
yield
大多数时候,在switch
表达式内部,我们会返回简单的值。但是,如果需要复杂的语句,我们也可以写很多语句,放到{...}
里,然后,用yield
返回一个值作为switch
语句的返回值。
练习
4、while循环
while
条件循环的基本用法是:
while (条件表达式) {
循环语句
}
// 继续执行后续代码
while
循环在每次循环开始前,首先判断条件是否成立。如果计算结果为true,就把循环体内的语句执行一遍,如果计算结果为false,那就直接跳到while循环的末尾,继续往下执行。
while
循环先判断循环条件是否满足,再执行循环语句;while
循环可能一次都不执行;- 编写循环时要注意循环条件,并避免死循环。
5、do while循环
do while
循环则是先执行循环,再判断条件,条件满足时继续循环,条件不满足时退出。它的用法是:
do {
执行循环语句
} while (条件表达式);
可见,do while循环会至少循环一次。