如果要想从控制台读取输入,可以使用Scanner类从控制台输入。
Java使用System.out来表示标准输出设备,使用System.in表示标准输入设备。默认情况下,输出设备是显示器,而输入设备是键盘。Java并不直接支持控制台输入,但是可以使用Scanner类创建它的对象,以读取来自System.in的输入。如下所示:
Scanner input = new Scanner(System.in);
通过查阅API可以知道,Scanner类位于java.util包下,总结出表4-1中的常用方法来读取各种不同类型的输入。
表4-1 Scanner对象常用的方法
| 方法 | 描述 |
|---|---|
| nextByte() | 读取一个byte类型的整数 |
| nextShort() | 读取一个short类型的整数 |
| nextInt() | 读取一个int类型的整数 |
| nextLong() | 读取一个long类型的整数 |
| nextFloat() | 读取一个float类型的数 |
| nextDouble | 读取一个double类型的数 |
| next() | 读取一个字符串,该字符在一个空白符之前结束 |
| nextLine() | 读取一行文本(即以按下回车键为结束标志) |
boolean数据类型
选择语句要用到条件。条件就是布尔表达式。Java提供了六种比较运算符(comparison operator)(也称为关系运算符(relational operator)),用于两个值的比较。
表4-2 6种比较运算符
| 运算符 | 名称 |
|---|---|
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| == | 等于 |
| != | 不等于 |
具有布尔值的变量称为布尔变量(boolean variable),boolean数据类型用于声明布尔型变量。boolean型变量只可能是true和false中的一个。
有时候,是否执行一条语句是由几个条件组合来决定的。可以使用逻辑运算符(logical operator)组合这些条件。逻辑运算符也称为布尔运算符(boolean operator),是对布尔值进行的运算,它会创建新的布尔值。
表4-3 逻辑运算符
| 运算符 | 名称 | 描述 |
|---|---|---|
| && | 与 | 当且仅当两个操作数都为真,条件才为真。 |
| || | 或 | 如果任何两个操作数任何一个为真,条件为真。 |
| ! | 非 | 用来反转操作数的逻辑状态。如果条件为true,则逻辑运算符将得到false。 |
if语句
Java有几种类型的选择语句:单向if语句、双向if语句、嵌套if语句、switch语句和条件表达式。
单向if语句
单向if语句是指当且仅当条件为true时执行一个动作。语法如下:
if (布尔表达式) {
语句;
}
双向if语句
当指定条件为true时,单向if语句执行一个操作。如果希望条件为false时也能执行一些操作,可以使用双向if语句。语法如下:
if (布尔表达式) {
布尔表达式为真时执行的语句;
} else {
布尔表达式为假时执行的语句;
}
注意:通常如果花括号中只有一条语句,可以省略花括号。但是,这样写在代码多的情况下会出现难以理解的语义。为了避免以后出现BUG而难以查找,应该尽量少用这种写法。
嵌套if语句
if或if...else语句中的语句可以是任意合法的Java语句,甚至可以是其它的if或if...else语句。外层if语句里的内层if语句称为是嵌套的。内层if语句还可以包含其他的if语句,对嵌套的深度没有限制。语法如下:
if (布尔表达式) {
if (布尔表达式) {
布尔表达式为真时执行的语句;
}
} else {
布尔表达式为假时执行的语句;
}
嵌套的if语句可用于实现多重选择。
switch语句
过多的使用嵌套的if语句会使程序难以阅读,Java提供switch语句来有效地处理多重条件的问题。语法如下:
switch (表达式) {
case 值1:
语句1;
break;
case 值2:
语句2;
break;
case 值N:
语句N;
break;
default:
默认情况下执行的语句;
}
switch语句遵循以下规则:
-
switch表达式必须能计算出一个char、byte、short或int型值(在Java高版本中,支持String型值),并且必须总是要用括号括住。
-
value1,...,valueN必须与switch表达式的值具有相同的数据类型。value1,...,valueN不能包含变量。
-
当switch表达式的值于case语句的值相匹配时,执行从该case开始的语句,直到遇到一个break语句或到达该switch语句的末端。
-
关键字break是可选的。break语句会立即终止整个switch语句。
-
default是可选的,用来指定没有一个指定的case与switch表达式匹配时应该采取的操作。
-
case语句是顺序检测的,但是,良好的编程风格应该将default放在最后。
-
不要忘记在需要的时候使用break语句。一旦匹配其中一个case,而该case中无break,就从匹配的case处开始执行,直到遇到break语句或到达switch语句的末端。
编程练习
问题1:判断闰年
如果某年可以被4整除而不能被100整除,或者可以被400整除,那么这一年就是闰年(leap year)。
思路:可以使用布尔表达式判断某年是否为闰年。
1 import java.util.Scanner; 2 /** 3 * 判断是否为闰年。 4 */ 5 public class LeapYear { 6 public static void main(String[] args) { 7 Scanner input = new Scanner(System.in); 8 System.out.println("请输入年份:"); 9 int year = input.nextInt(); 10 //如果输入的年份可以被4整除而不能被100整除,或者可以被400整除 11 boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 12 if (isLeapYear) { 13 System.out.println("是闰年"); 14 } else { 15 System.out.println("不是闰年"); 16 } 17 } 18 }
根据用户输入的年份和月份,判断出该月的具体天数,然后显示这个月的天数。
思路:年有平年闰年,可以根据问题1判断出平年闰年,再根据switch对应具体月份的天数。
1 import java.util.Scanner; 2 /** 3 * 根据用户输入的年份和月份,判断该月具体天数。 4 */ 5 public class SumDay { 6 public static void main(String[] args) { 7 Scanner input = new Scanner(System.in); 8 System.out.println("请输入年份:"); 9 //年份 10 int year = input.nextInt(); 11 System.out.println("请输入月份:"); 12 //月份 13 int mouth = input.nextInt(); 14 //需要计算的天数,默认初始为0 15 int day = 0; 16 //判断输入的是平年还是闰年 17 boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 18 switch (mouth) { 19 case 1: 20 day = 31; 21 break; 22 case 2: 23 if (isLeapYear) { 24 day = 29; 25 } else { 26 day = 28; 27 } 28 break; 29 case 3: 30 day = 31; 31 break; 32 case 4: 33 day = 31; 34 break; 35 case 5: 36 day = 31; 37 break; 38 case 6: 39 day = 31; 40 break; 41 case 7: 42 day = 31; 43 break; 44 case 8: 45 day = 31; 46 break; 47 case 9: 48 day = 31; 49 break; 50 case 10: 51 day = 31; 52 break; 53 case 11: 54 day = 31; 55 break; 56 case 12: 57 day = 31; 58 break; 59 default: 60 day = -1; 61 break; 62 } 63 if (day <= 0) { 64 System.out.println("月份输入有误"); 65 } else { 66 System.out.println(year + "年" + mouth + "月有" + day + "天"); 67 } 68 } 69 }
浙公网安备 33010602011771号