一、本节课目标分清基本类型、引用类型作为方法参数时的传递区别彻底搞懂 Java 只有值传递不存在引用传递能看懂参数传递的内存变化写出对应课堂案例与练习题二、核心结论必背Java 中所有方法参数统一为值传递 调用方法时会把实参的副本传给形参形参操作的是副本不直接操作原变量。 分两大类基本数据类型、引用数据类型。三、1. 基本数据类型做参数byte/short/int/long/float/double/char/boolean特点传递变量的值副本方法内修改形参不会影响外面的实参。示例代码java运行public class Lesson26 { public static void changeNum(int num){ num 100; // 修改的是副本 System.out.println(方法内num num); } public static void main(String[] args) { int a 10; changeNum(a); System.out.println(方法外a a); // 输出10不会变 } }运行结果plaintext方法内num100 方法外a10原理栈内存复制一份数值给形参两者完全独立。四、2. 引用数据类型做参数数组、类对象、String 等传递的是地址值副本 形参拿到和实参相同的堆内存地址通过地址修改堆里的内容原变量会受影响 但如果给形参重新赋值新地址不会改变外部实参。案例 1数组作为参数修改数组元素外部数组改变java运行public class Lesson26 { public static void changeArr(int[] arr){ arr[0] 999; // 通过地址修改堆中数组元素 } public static void main(String[] args) { int[] nums {1,2,3}; changeArr(nums); System.out.println(nums[0]); // 输出999原数组被修改 } }案例 2给形参数组重新赋值外部数组不变java运行public class Lesson26 { public static void changeArr(int[] arr){ arr new int[]{10,20,30}; // 形参指向新数组和外部无关 } public static void main(String[] args) { int[] nums {1,2,3}; changeArr(nums); System.out.println(nums[0]); // 输出1原数组不变 } }五、特殊String 字符串参数String 是引用类型但字符串不可变一旦创建不能修改。 方法内给字符串形参重新赋值外部原字符串不受影响。java运行public class Lesson26 { public static void changeStr(String s){ s 新字符串; } public static void main(String[] args) { String str 原始文本; changeStr(str); System.out.println(str); // 原始文本 } }六、对比总结表表格参数类型传递内容修改形参变量本身通过地址修改堆内数据基本类型数值副本不影响外部无堆内存数组 / 自定义对象地址副本不影响外部外部变量能看到变化String地址副本不影响外部字符串不可变无法修改原内容七、课堂练习题定义方法交换两个 int 变量的值运行观察能否交换成功说明原因。java运行public static void swap(int x,int y){ int temp x; x y; y temp; }答案不能交换基本类型值传递只修改副本。自定义 Person 类name 属性写方法修改对象的 name测试外部对象是否变化。八、课后作业写一个方法接收 int 数组将数组所有元素扩大 2 倍打印原数组验证。区分两段代码修改数组元素、给数组形参 new 新数组分别写出运行结果并解释内存原理。九、本课小结Java 只有值传递没有引用传递基本类型传数值副本互不干扰引用类型传地址副本可修改堆中内容不能改变外部变量本身指向String 不可变方法内重新赋值不会改变原字符串。
Java 入门第 26 课:方法的参数传递机制(值传递)
一、本节课目标分清基本类型、引用类型作为方法参数时的传递区别彻底搞懂 Java 只有值传递不存在引用传递能看懂参数传递的内存变化写出对应课堂案例与练习题二、核心结论必背Java 中所有方法参数统一为值传递 调用方法时会把实参的副本传给形参形参操作的是副本不直接操作原变量。 分两大类基本数据类型、引用数据类型。三、1. 基本数据类型做参数byte/short/int/long/float/double/char/boolean特点传递变量的值副本方法内修改形参不会影响外面的实参。示例代码java运行public class Lesson26 { public static void changeNum(int num){ num 100; // 修改的是副本 System.out.println(方法内num num); } public static void main(String[] args) { int a 10; changeNum(a); System.out.println(方法外a a); // 输出10不会变 } }运行结果plaintext方法内num100 方法外a10原理栈内存复制一份数值给形参两者完全独立。四、2. 引用数据类型做参数数组、类对象、String 等传递的是地址值副本 形参拿到和实参相同的堆内存地址通过地址修改堆里的内容原变量会受影响 但如果给形参重新赋值新地址不会改变外部实参。案例 1数组作为参数修改数组元素外部数组改变java运行public class Lesson26 { public static void changeArr(int[] arr){ arr[0] 999; // 通过地址修改堆中数组元素 } public static void main(String[] args) { int[] nums {1,2,3}; changeArr(nums); System.out.println(nums[0]); // 输出999原数组被修改 } }案例 2给形参数组重新赋值外部数组不变java运行public class Lesson26 { public static void changeArr(int[] arr){ arr new int[]{10,20,30}; // 形参指向新数组和外部无关 } public static void main(String[] args) { int[] nums {1,2,3}; changeArr(nums); System.out.println(nums[0]); // 输出1原数组不变 } }五、特殊String 字符串参数String 是引用类型但字符串不可变一旦创建不能修改。 方法内给字符串形参重新赋值外部原字符串不受影响。java运行public class Lesson26 { public static void changeStr(String s){ s 新字符串; } public static void main(String[] args) { String str 原始文本; changeStr(str); System.out.println(str); // 原始文本 } }六、对比总结表表格参数类型传递内容修改形参变量本身通过地址修改堆内数据基本类型数值副本不影响外部无堆内存数组 / 自定义对象地址副本不影响外部外部变量能看到变化String地址副本不影响外部字符串不可变无法修改原内容七、课堂练习题定义方法交换两个 int 变量的值运行观察能否交换成功说明原因。java运行public static void swap(int x,int y){ int temp x; x y; y temp; }答案不能交换基本类型值传递只修改副本。自定义 Person 类name 属性写方法修改对象的 name测试外部对象是否变化。八、课后作业写一个方法接收 int 数组将数组所有元素扩大 2 倍打印原数组验证。区分两段代码修改数组元素、给数组形参 new 新数组分别写出运行结果并解释内存原理。九、本课小结Java 只有值传递没有引用传递基本类型传数值副本互不干扰引用类型传地址副本可修改堆中内容不能改变外部变量本身指向String 不可变方法内重新赋值不会改变原字符串。