栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java复习总结之快速区分值传递和引用传递

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java复习总结之快速区分值传递和引用传递

引言

为了搞清楚值传递和引用传递的区别,查阅了许多资料,加以自身理解,做出本篇博客用于记录。

概念

值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递:指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 误区

错误理解一:通过传递的内容区分,如果是个值,就是值传递。如果是个引用,就是引用传递。错误理解二:Java是引用传递。错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。 举例 实例1

public class TestOne {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        swap(num1, num2);
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

输出:

为什么swap输出的值进行了交换,而main输出的却没交换?

1、首先,我们都知道,对于基本数据类型来说,使用的是值传递。即
t=a;a=b;b=t; 这种情况。
2、但在函数方法中,即实参传递给形参这种情况下,首先把实参复制了一份,并复制给形参。也就是得到的形参是实参的备份。
3、通过对复制出来的备份进行值的交换,并不会影响原来的数值。这也就说明了为什么swap输出的值进行了交换,而main输出的却没交换。

实例2
public class TestTwo {
    public static void main(String[] args) {
        Student t1 = new Student("张三", 18);
        Student t2 = new Student("李四", 19);
        swap(t1, t2);
        System.out.println(t1);
        System.out.println(t2);
    }

    private static void swap(Student t1, Student t2) {
        Student t = t1;
        t1=t2;
        t2=t;
        System.out.println("t1:"+t1);
        System.out.println("t2:"+t2);
    }
}
class Student {
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Test{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

输出:

原因同实例1,只不过本实例是将实参的地址复制了一份,并赋值给形参,然后进行交换,使其改变指向。
但是,注意: 这并不是引用传递,在Java里只能叫传递了对象的引用,本质上是传递了对象的引用(地址)的副本,这也算值传递。

若将交换函数改成如下代码,则成功进行交换

    private static void swap(Student t1, Student t2) {
        Student t = new Student("流星",20);
        t.name=t1.name;
        t.age = t1.age;
        t1.name= t2.name;
        t1.age= t2.age;
        t2.name= t.name;
        t2.age = t.age;
    }
总结

1、Java 没有引用传递
2、Java 传递对象 确实是传递对象的引用。更确切的说是传递的对象引用的副本。
3、Java传递的是引用的副本,而不是引用本身,所以引用没有传递,所以这个不叫引用传递。

附:参考资料

1、为什么说Java中只有值传递
2、Java只有值传递

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769708.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号