Java · 第 2 章

第 2 章 语法基础

八种基本类型表与默认值;字面量后缀;自动/强制类型转换与溢出;运算符(整数除法、自增、短路求值);Scanner 键盘输入。

2.1 八种基本数据类型

背这张表是基本功,考试和写代码都要用。

类型占字节范围默认值典型用途
byte1−128 ~ 1270节省空间的整数、文件字节
short2−32768 ~ 327670较少用
int4约 ±21 亿0整数默认类型
long8约 ±9.2×10¹⁸0L大整数(时间戳、金额分)
float4约 7 位有效数字0.0f少用,需 f 后缀
double8约 15 位有效数字0.0小数默认类型
char2单个 Unicode 字符'\u0000''A'、'中'
boolean未规定true / falsefalse判断条件
字面量后缀(写错就编译不过)
  • 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 题)
  1. 整数和小数字面量的默认类型分别是什么? 答:整数默认 int,小数默认 double。
  2. long t = 3000000000; 为什么报错? 答:30 亿超过 int 最大值(约 21 亿),需写成 3000000000L。
  3. 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 题)
  1. int x = 7 / 2; 和 double y = 7 / 2.0; 的结果分别是多少? 答:x = 3(整数除法截断);y = 3.5。
  2. (int) 2.9 + (int) 3.1 等于多少? 答:2 + 3 = 5(各先截断再相加)。
  3. 把 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 : bint 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 题)
  1. int i = 5; int j = i++ + ++i; 求 i、j。 答:i++ 用 5 后 i=6;++i 先变 7 再用 7 → j = 5 + 7 = 12,i = 7。
  2. 判断 n 是偶数怎么写? 答:if (n % 2 == 0)。
  3. 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 题)
  1. 读入两个整数并输出它们的和,需要哪些关键语句? 答:import java.util.Scanner; → Scanner sc = new Scanner(System.in); → int a = sc.nextInt(); int b = sc.nextInt(); → System.out.println(a + b);
  2. 为什么 nextInt() 后面直接 nextLine() 会读到空字符串?怎么解决? 答:nextInt 只取数字、把换行符留在输入缓冲区,nextLine 立即遇到换行就返回空。在两者之间加一句 sc.nextLine(); 吃掉换行。