【参数传递】java参数传递(swap示例)

方法调用时参数传递的方式有两种:按值传递和按引用传递。

  1. 按值传递(Pass-by-Value): 当传递基本数据类型(如 intfloatboolean 等)作为参数时,实际上传递的是值的副本。也就是说,方法内部对参数进行的修改不会影响到原始变量。

  2. 按引用传递(Pass-by-Reference): 当传递引用类型(如类对象、数组等)作为参数时,实际上传递的是引用的副本。也就是说,方法内部对参数进行的修改会影响到原始变量。

  • 在 Java 中,虽然传递引用类型参数时,形式上看起来像是按引用传递,但实际上还是按值传递。因为传递给方法的仍然是引用的副本,而不是原始的引用本身。

  • 这也就是为什么在 swap(Student a, Student b) 方法中交换了形参 ab 的引用,但并没有影响到 main 函数中的变量 a1b1 的引用。

示例:

package Test;
​
public class Func {
    public static void main(String[] args) {
        int a=1;
        int b=2;
        swap(a,b);
        System.out.println(a+" "+b);
        Student a1=new Student();
        a1.name="张三";
        Student b1=new Student();
        b1.name="李四";
        swap(a1,b1);
        System.out.println(a1.name+" "+b1.name);
        swap1(a1,b1);
        System.out.println(a1.name+" "+b1.name);
    }
    public static void swap(Student a, Student b){
        Student c=a;
        a=b;
        b=c;
    }
​
    public static void swap(int a, int b){
        int temp=a;
        a=b;
        b=temp;
    }
​
    public static void swap1(Student a, Student b){
        String name=a.name;
        a.name=b.name;
        b.name=name;
    }
​
}
​
class Student{
    String name;
    int  age;
}
​

上图为输出结果

为什么出现这样的结果,前两个打印出结果没有实现交换,最后一个从结果上来说实现了交换

  • 当调用 swap(a, b) 时,实际上是将 ab 的值复制给了函数 swap 中的两个新变量 int aint b。在函数 swap 内部,对这两个新变量进行了交换操作。简单来说,当调用 swap(a, b) 时,函数 swap 操作的是 ab 的副本,而不是原始的 ab。所以在 main 函数中,ab 的值没有发生改变。

  • 同理在函数 swap(Student a, Student b) 中,创建一个临时变量 c 来交换参数 ab 的引用。当调用 swap(a1, b1) 时,函数会创建两个新的引用变量 ca,并将 a1 的引用复制给了 c,将 b1 的引用复制给了 a。然后,将 c 的值(也就是 a1 的引用)赋给了 b,完成了 ab 引用的交换。

  • swap1(Student a, Student b)中,我们获取到了a.name和b.name的属性,并对原始字符串进行了修改。这里成功交换仅限于交换对象的属性,而不是交换对象本身。也就是说,ab 对象的引用并没有发生改变,仍然指向原来的对象。只是对象的属性值被交换了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,函数和参数传递的方式主要有以下几种: 1. 值传递(Pass by Value):函数调用时,将实参的值复制一份给形参,函数内部对形参的修改不会影响实参的值。这是Java中默认的参数传递方式。 示例代码: ``` public class Test { public static void main(String[] args) { int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1 + ", num2 = " + num2); } public static void swap(int a, int b) { int temp = a; a = b; b = temp; } } ``` 输出结果为:num1 = 10, num2 = 20,因为函数内部的交换操作只是交换了形参a和形参b的值,并不影响实参num1和num2的值。 2. 引用传递(Pass by Reference):函数调用时,将实参的引用传递给形参,形参和实参指向同一块内存地址,函数内部对形参的修改会影响实参的值。Java中没有显式支持引用传递的语法,但可以通过使用对象来实现引用传递示例代码: ``` public class Test { public static void main(String[] args) { int[] arr = {1, 2, 3}; changeArr(arr); System.out.println(Arrays.toString(arr)); } public static void changeArr(int[] a) { a[0] = 4; a[1] = 5; a[2] = 6; } } ``` 输出结果为:[4, 5, 6],因为changeArr函数中对形参a的修改会直接影响实参arr的值。 3. 对象传递(Pass by Object):在Java中,对象也是引用类型,函数调用时,将实参对象的引用传递给形参对象,形参和实参指向同一块内存地址,函数内部对形参对象的修改会影响实参对象的值。 示例代码: ``` public class Test { public static void main(String[] args) { Person p = new Person("Tom"); changeName(p); System.out.println(p.getName()); } public static void changeName(Person person) { person.setName("Jerry"); } } class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` 输出结果为:Jerry,因为changeName函数中对形参person的修改会直接影响实参p所指向的Person对象的name属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值