文章目录
- 一、定义
- 二、作用域和作用位置
- 三、声明周期和初始化
- 四、内存管理
- 五、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; // 必须先赋值
}