AP CSA(Java变量作用域、函数传值与传引用)

在 Java 中,参数传递的方式对于基本数据类型和引用类型有所不同。以下是关于 Java 变量作用域、传值和传引用的详细说明,包括数组作为参数传递的情况:

Java 变量作用域

  1. 局部变量作用域

    • 局部变量是在方法、构造方法或者语句块中定义的变量。它的作用域从声明开始,到包含它的代码块结束。
    • 示例:
      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);
          }
      }
      
  2. 方法参数作用域

    • 方法参数是作为方法输入的变量。它们的作用域是整个方法。
    • 示例:
      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
          }
      }
      
  3. 实例变量作用域

    • 实例变量是在类中定义的,但在方法、构造方法和语句块之外的变量。它们的作用域是整个类。
    • 示例:
      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();
          }
      }
      
  4. 类变量(静态变量)作用域

    • 类变量是使用 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 中的传值和传引用

  1. 传值(Pass-by-Value)

    • 基本数据类型(如 intcharbooleanfloatdouble 等)是按值传递的。当方法调用时,实际参数的值被复制给形式参数,方法内对形式参数的修改不会影响实际参数。
    • 示例:
      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
      
  2. 传引用(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
      
  3. 数组作为参数传递

    • 数组是引用类型,传递数组时,传递的是数组的引用。因此,方法内对数组元素的修改会影响原数组。
    • 示例:
      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
      

总结

  • 基本数据类型:按值传递,方法内修改不会影响原变量。
  • 引用类型(对象、数组):按引用传递,方法内修改会影响原对象,但重新赋值不会影响原引用。
posted @ 2025-04-19 08:49  kkman2000  阅读(78)  评论(0)    收藏  举报