成员变量必须定义在类内、方法外,分实例变量(无static,各对象独立)和静态变量(有static,类加载时初始化、所有实例共享);默认有初值但显式初始化更安全;推荐private+final+防御性拷贝保障封装与安全。

成员变量的声明位置和语法
Java中成员变量必须定义在类内部、方法外部,不能写在方法里或代码块中。它属于类或实例,生命周期与对象或类本身绑定。
基本语法是:修饰符 数据类型 变量名 [= 初始值];
-
private int count = 0;是典型的实例成员变量,每个对象独立一份 -
public static final String VERSION = "1.2";是类变量(静态常量),所有实例共享 - 不加
static就是实例变量;加了static就是类变量,注意二者内存归属和初始化时机不同
实例变量 vs 静态变量的区别
关键不在“能不能用”,而在“谁持有”和“何时初始化”。
- 实例变量:随对象创建而分配内存,
new MyClass()时才初始化,不同对象互不影响 - 静态变量:类加载时就分配内存,只有一份,所有实例共享;即使没创建任何对象也能通过
MyClass.staticVar访问 - 静态变量不能直接访问实例变量(会报错
non-static variable xxx cannot be referenced from a static context)
初始化方式和常见陷阱
成员变量有默认初始值(如 int 是 0,Object 是 null),但显式初始化更安全、意图更清晰。
立即学习“Java免费学习笔记(深入)”;
- 声明时赋值:
private List—— 最常用,推荐items = new ArrayList(); - 构造器中赋值:
this.items = new ArrayList();—— 适合需要参数参与初始化的场景 - 实例初始化块:
{ items = new ArrayList<>(); }—— 少用,多构造器共用逻辑时才考虑 - 避免在静态变量中引用
this或调用非静态方法,编译直接失败
命名和访问控制的实际影响
成员变量的修饰符直接影响封装性和线程安全性,不是随便选的。
-
private是首选:强制走 getter/setter,便于后期加校验、日志或同步逻辑 -
protected仅在有继承且子类需直接访问时使用,容易破坏封装 - 不加修饰符(包级私有)看似方便,但跨包复用时立刻暴露问题
-
public成员变量几乎总是错误设计,等于放弃对字段状态的控制权
真正容易被忽略的是:即使 private,反射仍能绕过访问控制;如果涉及敏感数据或不可变性要求,得配合 final 和防御性拷贝来补足。









