楼层: 首页/ 软件技术/ Java 基础/ 基础语法:变量、类型、流程控制
02

基础语法:变量、类型、流程控制

Variables · Primitive Types · Flow Control · switch

这一章是"认字"阶段。Java 语法比 Python 啰嗦,但啰嗦有啰嗦的好处——类型明确,bug 提前暴露。下面把最常用的零件一次摆齐,遇到不懂的术语先混个脸熟,后面章节会反复用到。

八种基本数据类型:别乱选,先记住这张表

Java 只有 8 种基本类型(primitive type),它们是"值本身",不是对象。除此之外的一切(字符串、数组、你自己写的类)都是引用类型。

类型占多大能装什么大白话场景
byte1 字节-128 ~ 127几乎用不到,知道有它就行。
short2 字节约 ±3.2 万也很少用。
int4 字节约 ±21 亿整数默认用它,日常 99% 的整数变量。
long8 字节极大超过 21 亿(比如时间戳毫秒)才用,字面量要加 L:10000000000L。
float4 字节单精度小数基本不用,精度坑多。
double8 字节双精度小数小数默认用它。
char2 字节单个字符'A',注意是单引号。
boolean1 位true / false真/假判断。

变量声明、赋值、类型推断(var)与流程控制

public class SyntaxDemo {
    public static void main(String[] args) {
        // 老写法:明确声明类型
        int age = 18;
        String name = "小明";

        // Java 10+ 新写法:var 让编译器自己推断类型,但变量一旦定下来类型就不能变
        var score = 92.5;   // 编译器推断为 double

        // if-else:和别的语言没区别
        if (score >= 60) {
            System.out.println(name + " 及格了");
        } else {
            System.out.println(name + " 要补考");
        }

        // for 循环:i 从 0 数到 4
        for (int i = 0; i < 5; i++) {
            System.out.println("第 " + i + " 次");
        }

        // while:当条件为真就一直转
        int countdown = 3;
        while (countdown > 0) {
            System.out.println(countdown);
            countdown--;
        }
    }
}

switch 新写法:别再写一堆 break 了

老版 switch 有个著名坑:每个 case 忘了写 break 就会"穿透",把后面的 case 也执行一遍。Java 14 正式版 开始支持箭头写法,不写 break 也不会穿透,还能直接赋值。

传统写法 vs 新写法对比

int day = 3;

// —— 老写法(Java 8 时代):漏 break 就穿透,像多米诺骨牌 ——
switch (day) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        System.out.println("工作日");
        break;          // 没有这句,会一路穿透到周末分支
    default:
        System.out.println("周末");
}

// —— 新写法(Java 14+):箭头 + 多值合并,自动不穿透 ——
String result = switch (day) {
    case 1, 2, 3, 4, 5 -> "工作日";
    case 6, 7 -> "周末";
    default -> "这是个什么日子";
};
System.out.println(result);   // 输出:工作日

运算符速查:别被名字唬住

写法意思
a == b / a != b相等 / 不等(对象比地址,字符串用 equals)。
&& / ||短路与 / 短路或:左边假,右边直接不看。
a ? b : c三目运算符:a 为真取 b,否则取 c。
+= -= *=加后赋值等简写。i++ 是先用再加,++i 是先加再用。

String 为什么"不可变",循环拼接为什么慢

String 是引用类型,但用法又像基本类型,新手最容易混。记住两句:① 字符串一旦创建,内容不能改,任何"修改"都是 new 一个新的;② 循环里 += 拼接就是疯狂 new 对象,所以要 StringBuilder。

String 拼接:错误示范 vs 正确做法

// 错误:循环十万次,每次都 new 一个新 String,GC 忙死
String s = "";
for (int i = 0; i < 100000; i++) {
    s += i;          // 底层其实在偷偷 new StringBuilder,每次循环都新建
}

// 正确:循环外用一个 StringBuilder 不断 append
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
    sb.append(i);
}
String result = sb.toString();
类型坑:整数除法与溢出

坑 1:5 / 2 在 Java 里等于 2,不是 2.5——两个 int 相除,结果还是 int,小数直接砍掉。想要 2.5,得写成 5.0 / 2。
坑 2:int 最大值约 21 亿,两个大数相加"溢出"会变成负数,不报错,悄悄错。真要存大数用 long 或 BigInteger。钱永远不要用 double 算,用 BigDecimal——这是第 12 章要反复敲的警钟。

章末面试 · 语法与类型(4 题)

1.(代码题)System.out.println(5 / 2); 输出什么?怎么改成 2.5?

查看答案

答案:输出 2。两个 int 相除结果还是 int,小数砍掉。要 2.5 写成 5.0 / 2 或 (double) 5 / 2。

2.(代码题)为什么循环拼接字符串要用 StringBuilder?str += "x" 底层发生了什么?

查看答案

答案:String 不可变,每次 += 都 new 一个新 String 和 StringBuilder,十万次循环就是十万个短命对象,GC 忙死。循环外 new 一个 StringBuilder 反复 append。

3.(选择题)下面哪个不是基本类型?A. int B. boolean C. String D. char

查看答案

答案:C。String 是引用类型(java.lang.String),不是基本类型。Java 只有 8 种基本类型。

4.(思考题)金额计算为什么不能用 double?

查看答案

答案:二进制浮点数无法精确表示 0.1。0.1 + 0.2 在 double 里是 0.30000000000000004。金额必须用 BigDecimal,构造时传字符串:new BigDecimal("0.1")。