Java 的作用域主要围绕变量展开(方法、类的作用域可看作更大范围的延伸),核心规则是:变量的作用域由声明它的 {}(代码块)决定,作用域内可访问,作用域外不可访问。
1. 局部作用域(方法 / 代码块内)
- 定义:在方法、循环、if 语句等 {} 内声明的变量(局部变量),作用域仅限于当前代码块。
- 特点:必须手动初始化,仅在代码块执行期间存在,外部无法访问。
java
运行
public class ScopeDemo { public static void main(String[] args) { // 局部变量:作用域是整个main方法 int a = 10; if (a > 5) { // 局部变量:作用域仅在if的{}内 int b = 20; System.out.println(a + b); // 能访问a和b,输出30 } // System.out.println(b); // 报错:无法访问b,超出作用域 } }2. 成员作用域(类级)
(1)实例变量(非 static)
- 定义:在类中、方法外声明的非 static 变量,作用域是整个类(所有实例方法)。
- 特点:属于对象,创建对象后才能访问,不同对象的实例变量相互独立。
java
运行
public class ScopeDemo { // 实例变量:作用域是整个类 String name = "Java"; public void show() { System.out.println(name); // 能访问,输出Java } }(2)类变量(static)
- 定义:用 static 修饰的成员变量,作用域是整个类(包括静态方法)。
- 特点:属于类,无需创建对象即可访问,所有对象共享同一个值。
java
运行
public class ScopeDemo { // 类变量:作用域是整个类 static int age = 25; public static void test() { System.out.println(age); // 能访问,输出25 } }3. 方法参数作用域
- 定义:方法的参数变量,作用域仅限于当前方法内部。
java
运行
public class ScopeDemo { public static void add(int x, int y) { // x和y的作用域仅在add方法内 int sum = x + y; System.out.println(sum); } public static void main(String[] args) { add(3, 5); // 输出8 // System.out.println(x); // 报错:无法访问参数x } }4. 注意:作用域的 “屏蔽效应”
当局部变量与成员变量同名时,局部变量会屏蔽成员变量(优先访问局部变量),可通过this(实例变量)或类名(类变量)区分:
java
运行
public class ScopeDemo { String name = "全局"; public void test() { String name = "局部"; System.out.println(name); // 输出“局部”(局部屏蔽全局) System.out.println(this.name); // 输出“全局”(指定访问实例变量) } }总结
- Java 作用域核心是 “{} 决定范围”,局部变量作用域最小,类变量作用域覆盖整个类;
- 局部变量必须初始化,成员变量有默认值(如 int 默认 0、String 默认 null);
- 同名变量遵循 “局部屏蔽全局”,可通过
this/类名显式访问成员变量。