成员变量与局部变量的区别

成员变量与局部变量的区别

1. 先明确核心定义

  • 成员变量:定义在类中、方法外的变量,属于整个对象(或类),也叫 “字段 / 属性”;

  • 局部变量:定义在方法内、方法参数、代码块(如 if/for)内的变量,只在当前代码块有效。

2. 核心区别对比

特性

成员变量

局部变量

定义位置

类中、方法外

方法内、方法参数、代码块内

所属对象

属于类 / 对象

属于当前方法 / 代码块

内存存储位置

堆内存(对象的一部分)

栈内存(方法栈帧中)

生命周期

随对象创建而创建,随对象被 GC 回收而销毁

随方法 / 代码块执行开始创建,执行结束立即销毁

默认值

有默认值(如 int=0、boolean=false)

无默认值,必须手动赋值后才能使用

访问修饰符

可以加(public/private/protected 等)

不能加(只能用 final 修饰)

作用域

整个类(非静态)/ 整个程序(静态)

仅定义它的方法 / 代码块内

关键字 static

可以加(静态成员变量,属于类)

不能加

关键补充

  • 成员变量的默认值:和基本数据类型的默认值一致(int=0、double=0.0、boolean=false、引用类型 = null);

  • 局部变量无默认值:如果声明后不赋值就使用,编译直接报错(这是新手最常踩的坑);

  • 局部变量只能用final修饰(表示常量),不能用public/private/static等修饰符。

3. 代码示例:直观区分两者

public class VariableDemo {
    // 1. 成员变量(类中、方法外)
    // 实例成员变量(属于对象,存在堆中)
    private String name; // 引用类型,默认值null
    public int age = 18; // 基本类型,手动赋值18
    // 静态成员变量(属于类,存在方法区)
    public static String gender = "男";

    // 方法
    public void test(int param) { // param是局部变量(方法参数)
        // 2. 局部变量(方法内)
        int score; // 声明局部变量(无默认值)
        // System.out.println(score); // 编译报错:局部变量未赋值
        
        score = 90; // 手动赋值后才能使用
        String temp = "临时变量"; // 局部变量
        
        if (score > 60) {
            String result = "及格"; // 局部变量(代码块内)
            System.out.println(result); // 仅在if块内有效
        }
        // System.out.println(result); // 编译报错:超出作用域
        
        // 使用成员变量(整个类都能访问)
        System.out.println(name); // 成员变量,默认值null
        System.out.println(age); // 成员变量,值为18
        System.out.println(gender); // 静态成员变量,值为"男"
        
        // 使用局部变量
        System.out.println(param); // 方法参数(局部变量)
        System.out.println(score); // 方法内局部变量
        System.out.println(temp); // 方法内局部变量
    }

    public static void main(String[] args) {
        VariableDemo demo = new VariableDemo();
        demo.test(100); // 调用方法,传入参数100(局部变量)
    }
}

输出结果

null
18
男
100
90
临时变量
及格

代码内存分析

  • 创建 demo 对象时,nameage 作为成员变量存在堆内存中(name 默认 null,age=18);

  • 调用 test(100) 时,栈中创建 test 方法的栈帧:

    • param=100score=90temp="临时变量" 作为局部变量存在栈内存

    • if 块内的 result="及格" 也存在栈中,if 块执行完后立即销毁;

  • test 方法执行完,栈帧销毁,所有局部变量释放;demo 对象仍在堆中,直到 GC 回收。

总结

  1. 定义位置是核心区分点:成员变量在类中方法外,局部变量在方法 / 代码块内;

  2. 内存和生命周期:成员变量在堆、随对象生命周期;局部变量在栈、随方法执行销毁;

  3. 默认值和修饰符:成员变量有默认值、可加访问修饰符;局部变量无默认值、仅能加 final。

Java 的基本数据类型 2026-02-25
Java中==与equals()的区别 2026-02-25