Java变量初始化和流程控制是写对代码的前提:成员变量自动赋默认值(如int为0、引用类型为null),局部变量必须显式初始化,否则编译报错;流程控制含顺序、分支(if-else需防边界遗漏、switch慎用fall-through)、循环(for中变量作用域有限)三大结构,且对象创建时初始化顺序严格遵循静态→非静态→构造器的执行链。

Java变量初始化和流程控制是写对代码的前提——变量没初始化好,程序可能编译失败或运行出错;流程控制没理清楚,逻辑就容易跳过、重复或卡死。这两块看似基础,但实际开发中出问题最多。
变量初始化分两类:成员变量自动赋默认值,局部变量必须手动赋值
Java对不同位置定义的变量,初始化规则完全不同:
- 成员变量(类里、方法外):哪怕你不写任何赋值语句,JVM也会悄悄给它设一个默认值——int是0、double是0.0、boolean是false、char是'\u0000'、引用类型(比如String)是null
- 局部变量(方法内、{}里):没有默认值,必须声明后立刻赋值,或者在使用前明确初始化,否则编译直接报错“variable might not have been initialized”
- 构造器里给成员变量赋值,不会覆盖默认初始化过程,而是后续覆盖;但局部变量一旦漏掉初始化,连编译都过不去
流程控制三大结构:顺序、分支、循环,每种都有典型陷阱
代码不是从上到下机械执行那么简单,流程控制决定了哪段该跑、跑几次、什么时候跳过:
- if-else链要小心遗漏边界:比如判断成绩等级,只写 if(score > 90) 和 else if(score > 80),但没处理 score < 0 或 score > 100 的情况,就可能让异常数据溜进else分支
- switch必须配break,除非有意“穿透”:case后面不写break,程序会继续执行下一个case里的代码——这叫fall-through,多数时候是bug,不是特性
- for循环注意变量作用域:for(int i = 0; i < 5; i++) 中的i只在循环体内有效;而 for(int i = 0; i < 5; i++) { ... } 外面不能再用i,否则编译报错
初始化顺序决定对象能不能正确创建
当你 new 一个对象时,JVM按固定顺序干活,这个顺序直接影响成员变量能否拿到预期值:
立即学习“Java免费学习笔记(深入)”;
- 先执行父类静态变量和静态块 → 再执行子类静态变量和静态块
- 接着执行父类非静态变量和非静态块 → 然后调父类构造器
- 再执行子类非静态变量和非静态块 → 最后调子类构造器
- 特别注意:如果在非静态变量初始化时就 new 了另一个对象(比如 class C { B b = new B(i); }),此时i可能还是默认值0——因为构造器还没执行,i还没被真正赋值
实战建议:用IDE提示+简单打印验证逻辑流
别光靠脑子想流程,动手验证最可靠:
- 在if/else每个分支开头加 System.out.println("进入xxx分支"),运行看哪条路径真走了
- 在构造器第一行、变量声明后、初始化块里都打一行日志,就能清晰看到JVM到底按什么顺序干活
- IntelliJ或VS Code对未初始化的局部变量会实时标红,对switch缺break会黄色警告——别忽略这些小图标
- 数值计算前先确认类型:10/3 得3(int除法),10.0/3 才得3.333…;字符串拼接用+时,1 + "a" + 2 结果是"1a2",不是"3a"


















