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

前言

想必很多人在学习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不存在指针,不能够进行引用传递,参数传递都是值传递,基本类型参数就是传递当前值,对象就是传递地址

猜你喜欢

转载自blog.csdn.net/m0_51545690/article/details/129212065
今日推荐