2.1 八种基本数据类型
背这张表是基本功,考试和写代码都要用。
| 类型 | 占字节 | 范围 | 默认值 | 典型用途 |
|---|---|---|---|---|
byte | 1 | −128 ~ 127 | 0 | 节省空间的整数、文件字节 |
short | 2 | −32768 ~ 32767 | 0 | 较少用 |
int | 4 | 约 ±21 亿 | 0 | 整数默认类型 |
long | 8 | 约 ±9.2×10¹⁸ | 0L | 大整数(时间戳、金额分) |
float | 4 | 约 7 位有效数字 | 0.0f | 少用,需 f 后缀 |
double | 8 | 约 15 位有效数字 | 0.0 | 小数默认类型 |
char | 2 | 单个 Unicode 字符 | '\u0000' | 'A'、'中' |
boolean | 未规定 | true / false | false | 判断条件 |
字面量后缀(写错就编译不过)
long型要加L:long x = 10000000000L;(不加 L 会被当 int 而超范围报错)float型要加f:float f = 3.14f;(3.14默认是 double)
易错
- 成员变量有默认值,局部变量没有:方法里写
int a;不赋值就用,直接编译报错。 char用单引号、String用双引号:'A'是字符,"A"是字符串。boolean不能和 0/1 互转(C/C++ 可以,Java 不行)。
课堂练习(3 题)
- 整数和小数字面量的默认类型分别是什么? 答:整数默认 int,小数默认 double。
long t = 3000000000;为什么报错? 答:30 亿超过 int 最大值(约 21 亿),需写成3000000000L。double占几个字节?char呢? 答:double 8 字节;char 2 字节(Unicode,可存一个汉字)。
2.2 类型转换:自动与强制
小杯子倒进大杯子没问题,大倒小会溢出——这是考点也是 BUG 源。
自动类型转换(小 → 大,安全,不用写):
byte → short → int → long → float → double
char → int
强制类型转换(大 → 小,可能丢精度):
double d = 3.99;
int i = (int) d; // i = 3(直接截断小数,不是四舍五入!)
int big = 200;
byte b = (byte) big; // b = -56(超出 byte 范围,溢出绕回)
两条硬规则
- 表达式中有 double 就都变 double:
1 / 2得0(整数除法),而1.0 / 2得0.5。 byte/short/char参与运算会先提升为 int:byte a=1,b=2; byte c=a+b;会报错,要写byte c=(byte)(a+b);
易错(考试高频)
- 整数除法陷阱:求平均值写
int avg = (a+b)/2会截断;求百分比必须先把一个操作数变浮点:double rate = score * 1.0 / total; - (int) 是截断不是四舍五入:要四舍五入用
Math.round()。 - char 能当整数算:
'A' + 1结果是66(int)。
课堂练习(3 题)
int x = 7 / 2;和double y = 7 / 2.0;的结果分别是多少? 答:x = 3(整数除法截断);y = 3.5。(int) 2.9 + (int) 3.1等于多少? 答:2 + 3 = 5(各先截断再相加)。- 把
double值 3.6 四舍五入成整数,表达式怎么写? 答:(int) Math.round(3.6)(Math.round 返回 long,转 int)。
2.3 运算符
重点只有三个:整数除法、自增自减、短路求值。
| 类别 | 运算符 | 要点 |
|---|---|---|
| 算术 | + - * / % | / 整数除法截断;% 取余可用于判断奇偶、循环取模 |
| 自增自减 | ++ -- | ++i 先加后用,i++ 先用后加 |
| 关系 | > < >= <= == != | 结果是 boolean |
| 逻辑 | && || ! | 短路:&& 左边为 false 就不再算右边 |
| 赋值 | = += -= *= /= %= | a += 3 隐含强制转换,byte b=1; b += 200; 不报错但会溢出 |
| 三元 | 条件 ? a : b | int max = a > b ? a : b; |
| 字符串拼接 | + | "结果=" + 10 → "结果=10" |
短路求值的妙用(也是考点)
if (s != null && s.length() > 0) { ... }
// ↑ 如果 s 是 null,右边不会执行 —— 用 && 就避免了空指针异常
// 换成 &(非短路)则两边都算,s 为 null 时崩溃
int i = 0;
boolean r = (i++ > 0) && (i++ > 1); // 左边 false → 右边不执行 → i 最终为 1
易错
&&与&:前者逻辑与(短路),后者可做位与也可做非短路逻辑与。"a" + 1 + 2得"a12",而1 + 2 + "a"得"3a"——拼接从左往右。
课堂练习(3 题)
int i = 5; int j = i++ + ++i;求 i、j。 答:i++ 用 5 后 i=6;++i 先变 7 再用 7 → j = 5 + 7 = 12,i = 7。- 判断 n 是偶数怎么写?
答:
if (n % 2 == 0)。 System.out.println(1 + 2 + "3" + 4 + 5);输出什么? 答:3345。先算 1+2=3,再拼 "3" 得 "33",之后全按字符串拼接得 "3345"。
2.4 键盘输入(Scanner)
第一学期写题必用:读整数、读小数、读字符串。
import java.util.Scanner; // ① 导入
public class InputDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // ② 创建扫描器
System.out.print("请输入整数:");
int n = sc.nextInt(); // ③ 读整数
System.out.print("请输入小数:");
double d = sc.nextDouble(); // 读小数
sc.nextLine(); // 吃掉上面残留的换行
System.out.print("请输入一行文字:");
String s = sc.nextLine(); // 读一整行
System.out.println("n=" + n + ", d=" + d + ", s=" + s);
sc.close(); // ④ 用完关闭
}
}
| 方法 | 读什么 | 注意 |
|---|---|---|
nextInt() | 一个整数 | 不读走行尾的换行 |
nextDouble() | 一个小数 | 输入要英文小数点 |
next() | 一个词(遇空格/换行停) | 读不到带空格的内容 |
nextLine() | 一整行(含空格) | 前面用过 nextInt 时要先多调一次 nextLine() 吃掉换行 |
易错(几乎人人都踩)
- nextInt 后紧跟 nextLine 会读到空串:因为 nextInt 只读数字、把换行留在缓冲区。解决:中间补一句
sc.nextLine();。 - 输入类型不匹配(输入字母却用 nextInt)会抛
InputMismatchException。
想直接跑上面的代码:打开 Java 在线运行环境 粘贴即可。
课堂练习(2 题)
- 读入两个整数并输出它们的和,需要哪些关键语句?
答:
import java.util.Scanner;→Scanner sc = new Scanner(System.in);→int a = sc.nextInt(); int b = sc.nextInt();→System.out.println(a + b); - 为什么 nextInt() 后面直接 nextLine() 会读到空字符串?怎么解决?
答:nextInt 只取数字、把换行符留在输入缓冲区,nextLine 立即遇到换行就返回空。在两者之间加一句
sc.nextLine();吃掉换行。