Java变量能否使用取决于声明位置、初始化方式和作用域范围:局部变量须在块内声明并显式初始化;实例变量属对象,有默认值但应主动赋值;静态变量属类,共享且加载时初始化。

Java变量能不能用、什么时候能用、用的是哪个值,全看它在哪声明、怎么初始化、作用域划到哪。搞不清这三点,轻则编译报错,重则运行时出bug却难定位。
局部变量:声明即用,但必须先赋值
写在方法里、for循环中、if块内或任意一对大括号{}里的变量,都属于局部变量。它的生命只在那个代码块里——出了花括号就彻底不可见,更不能访问。
- 没有默认值,只声明不赋值就使用,编译器直接拒绝,报错“variable might not have been initialized”
- 不能加public、private、static等修饰符
- 常见写法:int count = 0; 或 String msg = ""; ——推荐声明同时初始化,避免遗漏
- 别在if或for内部声明后续还要用的变量;真需要跨块访问,就把声明提到外层作用域
实例变量:属于对象,有默认值但别依赖
写在类里、所有方法外面,且没加static的变量,就是实例变量。每个对象一份,通过this或对象引用访问,比如user.name。
- 系统自动赋予默认值:int为0、boolean为false、引用类型为null
- 但业务上往往需要有意义的初始值,比如String status = "draft"; 比留空更安全
- 同名局部变量会遮蔽它,想明确调用成员变量,得加this.前缀,如this.id = id;
- 生命周期绑定对象:new出来时创建,GC回收时销毁
静态变量:属于类,共享一份,加载即存在
用static修饰、同样写在类里方法外的变量,属于类本身,不是某个对象。所有实例共用同一份数据,可通过类名直接访问,比如Config.TIMEOUT。
立即学习“Java免费学习笔记(深入)”;
- 类加载时初始化一次,有默认值(规则同实例变量)
- 适合存放全局配置、计数器、缓存等跨实例共享的状态
- 若需复杂初始化逻辑,可用static代码块,比如加载配置文件
- static final组合才是常量,命名建议全大写加下划线,如MAX_RETRY = 3
初始化不是可选项,而是编码习惯
无论变量在哪声明,主动初始化比依赖默认值更可靠。尤其注意:局部变量不赋值就不能读,而实例/静态变量的默认值(如0或null)可能掩盖业务逻辑缺陷。
- 声明即初始化最稳妥:List<String> items = new ArrayList<>();
- 避免在分支中漏掉赋值,比如if-else里只有一边给变量赋值,之后再用会编译失败
- IDE通常会标红未初始化的局部变量,别跳过这类提示
- 构造器和静态代码块是集中初始化的好位置,尤其对需要计算或外部依赖的字段


















