AP CSA(Java变量作用域、函数传值与传引用)
在 Java 中,参数传递的方式对于基本数据类型和引用类型有所不同。以下是关于 Java 变量作用域、传值和传引用的详细说明,包括数组作为参数传递的情况:
Java 变量作用域
-
局部变量作用域:
- 局部变量是在方法、构造方法或者语句块中定义的变量。它的作用域从声明开始,到包含它的代码块结束。
- 示例:
public class Main { public static void main(String[] args) { int x = 10; // 局部变量,作用域是 main 方法 if (true) { int y = 20; // 局部变量,作用域是 if 语句块 System.out.println("Inside if: x = " + x + ", y = " + y); } // System.out.println("Outside if: y = " + y); // 无法访问 y System.out.println("Outside if: x = " + x); } }
-
方法参数作用域:
- 方法参数是作为方法输入的变量。它们的作用域是整个方法。
- 示例:
public class Main { public static void printInfo(int age, String name) { System.out.println("Name: " + name + ", Age: " + age); } public static void main(String[] args) { printInfo(25, "John"); // System.out.println(name); // 无法访问 name } }
-
实例变量作用域:
- 实例变量是在类中定义的,但在方法、构造方法和语句块之外的变量。它们的作用域是整个类。
- 示例:
public class Person { String name; // 实例变量 int age; // 实例变量 public void displayInfo() { System.out.println("Name: " + name + ", Age: " + age); } public static void main(String[] args) { Person person1 = new Person(); person1.name = "Alice"; person1.age = 30; person1.displayInfo(); Person person2 = new Person(); person2.name = "Bob"; person2.age = 25; person2.displayInfo(); } }
-
类变量(静态变量)作用域:
- 类变量是使用
static关键字修饰的变量。它们的作用域是整个类,属于类本身而不是某个对象。 - 示例:
public class Counter { static int count = 0; // 类变量 public Counter() { count++; } public static void main(String[] args) { Counter c1 = new Counter(); Counter c2 = new Counter(); Counter c3 = new Counter(); System.out.println("Count: " + count); // 输出 3 } }
- 类变量是使用
Java 中的传值和传引用
-
传值(Pass-by-Value):
- 基本数据类型(如
int、char、boolean、float、double等)是按值传递的。当方法调用时,实际参数的值被复制给形式参数,方法内对形式参数的修改不会影响实际参数。 - 示例:
输出结果:public class Main { public static void changeValue(int num) { num = 100; System.out.println("Inside method: num = " + num); } public static void main(String[] args) { int x = 20; changeValue(x); System.out.println("Outside method: x = " + x); } }Inside method: num = 100 Outside method: x = 20
- 基本数据类型(如
-
传引用(Pass-by-Reference):
- 对象是通过引用来传递的。传引用其实也是传值,但是传递的是对象在内存中的地址(引用)。这使得方法内对对象的修改会影响原对象。
- 示例:
输出结果:public class Main { public static void changeObject(Student student) { student.name = "Jane"; student.age = 22; System.out.println("Inside method: name = " + student.name + ", age = " + student.age); } public static void main(String[] args) { Student s = new Student(); s.name = "John"; s.age = 20; changeObject(s); System.out.println("Outside method: name = " + s.name + ", age = " + s.age); } } class Student { String name; int age; }Inside method: name = Jane, age = 22 Outside method: name = Jane, age = 22
-
数组作为参数传递:
- 数组是引用类型,传递数组时,传递的是数组的引用。因此,方法内对数组元素的修改会影响原数组。
- 示例:
输出结果:public class Main { public static void changeArray(int[] nums) { nums[0] = 100; System.out.println("Inside method: nums = " + nums[0]); } public static void main(String[] args) { int[] nums = {1, 2, 3, 4, 5}; changeArray(nums); System.out.println("Outside method: nums = " + nums[0]); } }Inside method: nums = 100 Outside method: nums = 100
总结
- 基本数据类型:按值传递,方法内修改不会影响原变量。
- 引用类型(对象、数组):按引用传递,方法内修改会影响原对象,但重新赋值不会影响原引用。

浙公网安备 33010602011771号