文章目录
- 一、定义
 - 二、作用域和作用位置
 - 三、声明周期和初始化
 - 四、内存管理
 - 五、Java内存区域划分
 - 六、例子
 
一、定义
在java中,局部变量指在方法、构造方法、代码块(如{}包裹的语句块)内部声明的变量
class work {
    {int a = 10;}
    public work() {
        int a = 10;
    }
}
public class Test {
    public static void main(String[] args) {
        int x = 10;
        System.out.println(x);
    }
}
 
像上方代码。a都是属于局部变量
二、作用域和作用位置
- 作用域限制:仅在声明它的方法、构造方法或代码块内部有效,超出该范围无法访问
 
public void example() {
    int localVar = 10; // 局部变量,仅在example()方法内有效
    System.out.println(localVar); // 正确
}
// System.out.println(localVar); // 错误:超出作用域
 
- 定义位置:必须直接定义在方法体、构造方法或代码块中,而非类范围内
 
三、声明周期和初始化
-  
生命周期
生命周期:从变量声明时开始,到所在方法、构造方法或代码块执行结束时销毁。
例如,每次调用方法时会创建新的局部变量,执行完毕后释放。 -  
初始化要求
必须显式初始化:局部变量在使用前必须赋值,否则编译器会报错。 
例如:
public void test() {
    int x; 
    // System.out.println(x); // 错误:未初始化
    x = 5; // 必须先赋值
}
 
四、内存管理
内存管理
 存储位置:局部变量存储在栈内存中,随方法调用结束自动释放
与成员变量的主要区别
| 对比项 | 局部变量 | 成员变量 | 
|---|---|---|
| 定义位置 | 方法/代码块内部 | 类内部、方法外部 | 
| 作用域 | 限于声明块内 | 类内所有方法均可访问 | 
| 初始化 | 必须显式赋值 | 自动赋予默认值(如int为0,boolean赋值为false、字符型赋值为’\u0000’) | 
| 存储位置 | 栈内存 | 堆内存(实例变量)或方法区(静态变量指的是用static修饰的变量) | 
class student {
    public String name;
    public int age;
    public char sex;
    public float height;
    boolean guess;
}
public class Test {
    public static void main(String[] args) {
        student stu = new student();
        System.out.println(stu.name);
        System.out.println(stu.age);
        System.out.println(stu.sex);
        System.out.println(stu.height);
        System.out.println(stu.guess);
    }
}
 
在这里定义了一个类变量,但是没有初始化赋值,运行后,可发现编译器会自动赋值
 
五、Java内存区域划分
Java内存区域是指 JVM运行时将数据分区域存储 ,简单的说就是不同的数据放在不同的地方。通常又叫运行时数据区域。
java的内存区
 
在这里主要讲述一下虚拟机栈:
虚拟机栈
 虚拟机栈 描述的是 Java 方法执行的内存模型:
每个方法在执行的同时都会创建一个栈帧(Stack Frame,是方法运行时的基础数据结构)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
虚拟机栈是每个线程独有的,随着线程的创建而存在,线程结束而死亡。
在虚拟机栈内存不够的时候会OutOfMemoryError,在线程运行中需要更大的虚拟机栈时会出现StackOverFlowError。

 虚拟机栈包含很多栈帧,每个方法执行的同时会创建一个栈帧,栈帧又存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法。
六、例子
例1:方法内定义的变量
 在方法体中直接声明并使用的变量,必须显式初始化后才能使用
public void printMessage() {
    String message = "Hello, Java!"; // 局部变量 message
    //String message; //这是错误的使用
    System.out.println(message);
}
 
错误代码执行后出现结果
 
 例子2:代码块中的临时变量
 在 if、for 等代码块中声明的变量,仅在该块内有效
public void calculateSum() {
    int[] numbers = {1, 2, 3};
    for (int i = 0; i < numbers.length; i++) { // 局部变量 i
        int current = numbers[i];              // 局部变量 current
        System.out.println(current);
    }
    // System.out.println(current); // 错误:current 超出作用域
}
 
例子3:方法参数
 方法的形参本质上也是局部变量
public void greetUser(String name) { // name 是局部变量
    System.out.println("Welcome, " + name);
}
 
例子4:未初始化的局部变量会导致编译错误
public void example() {
    int count; // 声明但未初始化
    // System.out.println(count); // 错误:变量未初始化
    count = 10; // 必须先赋值
}
                


![智能合约安全指南 [特殊字符]️](https://i-blog.csdnimg.cn/direct/ad9c90db67c24bcb9b07a025138de58e.png)















