【java基础】值传递,址传递,引用传递

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【java基础】值传递,址传递,引用传递,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

前言

想必很多人在学习java之前就已经学习过c语言了吧,里面就值传递和址传递,在java中是否也存在类似的特性呢?下面通过几个例子来进行说明

基本数据类型的传递

    public void changeValue(int num) {
        num = 0;
    }
    
    @Test
    public void t1() {
        int num = 1;
        System.out.println("调用方法前:" + num);
        changeValue(num);
        System.out.println("调用方法后:" + num);
    }

大家看上面的代码,结果会输出上面?输出结果如下

调用方法前:1
调用方法后:1

通过输出结果就可以发现changeValue里面改变num的值其实并没有作用,也就可以说明对于基本数据类型来说,方法参数传递采用的是值传递

引用类型传递

    class Cat {
        public String name;

        public Cat(String name) {
            this.name = name;
        }
    }
    
    public void changeCatName(Cat cat) {
        cat.name = "汤姆";
    }
    
    @Test
    public void t2() {
        Cat cat = new Cat("tom");
        System.out.println("修改前的名称:" + cat.name);
        changeCatName(cat);
        System.out.println("修改后的名称:" + cat.name);
    }

大家看一下上面代码会输出什么,Cat的name会发生变化吗?输出结果如下

修改前的名称:tom
修改后的名称:汤姆

可以发现,changeCatName成功修改了Cat的name,这也就可以说明在java中,引用类型的参数传递是址传递

引入传递 OR 值传递

上面我们发现了参数传递可以修改对象的值,但是传递的是地址还是引用想必大家还是有疑问,下面我们先来看一段代码

    public void swapCat(Cat cat1, Cat cat2) {
        Cat temp = cat1;
        cat1 = cat2;
        cat2 = temp;
    }

    @Test
    public void t3() {
        Cat cat1 = new Cat("小花");
        Cat cat2 = new Cat("小黑");
        System.out.println("交换前的cat1的名称:"+cat1.name+"  hashcode:"+cat1.hashCode());
        System.out.println("交换前的cat2的名称:"+cat2.name+"  hashcode:"+cat2.hashCode());
        swapCat(cat1, cat2);
        System.out.println("\n交换后的cat1的名称:"+cat1.name+"  hashcode:"+cat1.hashCode());
        System.out.println("交换后的cat2的名称:"+cat2.name+"  hashcode:"+cat2.hashCode());
    }

大家可以思考一下,swapCat是不是真的会交换cat1和cat2呢?输出结果如下

交换前的cat1的名称:小花  hashcode:1291113768
交换前的cat2的名称:小黑  hashcode:2005167404

交换后的cat1的名称:小花  hashcode:1291113768
交换后的cat2的名称:小黑  hashcode:2005167404

可以发现,我们在swapCat中明明交换了2个Cat的地址,但是却并没有对cat1和cat2造成影响,这也就说明了引用类型进行参数传递,传递的是地址的值,相当于是一个副本,并不是该对象的引用。

总结

  1. 方法不能修改基本数据类型的参数
  2. 方法可以改变对象的参数
  3. 方法不能让一个对象参数引用到一个新的对象

大家需要记住的是java不存在指针,不能够进行引用传递,参数传递都是值传递,基本类型参数就是传递当前值,对象就是传递地址

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140205.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!