Java 值传递

Java中只有值传递,没有引用传递

  • 值传递:是指在调用函数时,将实际参数复制一份传递给函数,这样在函数中修改参数时,不会影响到实际参数。其实,就是在说值传递时,只会改变形参,不会改变实参。
  • 引用传递:是指在调用函数时,将实际参数的地址传递给函数,这样在函数中对参数的修改,将影响到实际参数。
1、传递参数是基本类型时
public class TestNum {
    public static void main(String[] args) {
        int num = 3;
        System.out.println("修改前的num值:"+num);
        changeValue(num);
        System.out.println("修改后的num值:"+num);
    }

    private static void changeValue(int num) {
        num = 5;
        System.out.println("形参num值:"+num);
    }
}

在这里插入图片描述

可以发现,传递基本数据类型时,在函数中修改的仅仅是形参,对实参的值的没有影响
需要明白一点,值传递不是简单的把实参传递给形参,而是,实参建立了一个副本,然后把副本传递给了形参。

2、传递参数是引用类型时

首先准备一个Person类

public class Person{

    private int age;
    private String name;

    public Person(){}

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
2.1 引用对象的指向未发生变化
public class TestClass {

    public static void main(String[] args) {

        Person person = new Person(18, "luosanliang");
        System.out.println("对象修改前:" + person);
        changePerson(person);
        System.out.println("对象修改后:" + person);

    }

    public static void changePerson(Person person){
        person.setAge(20);
        person.setName("java");
    }
}

在这里插入图片描述

问题:发现当传递的变量变为引用变量时,方法中形参的修改导致实参也发生了修改
原因:Java当中,对象存放在堆中, 其引用存放在栈中。当实参创建副本传递给形参时,它们实际操作的都是堆内存中的同一个对象


2.2 引用对象的指向发生变化
public class TestClass {

    public static void main(String[] args) {

        Person person = new Person(18, "luosanliang");
        System.out.println("对象修改前:" + person);
        changePerson(person);
        System.out.println("对象修改后:" + person);

    }

    public static void changePerson(Person person){
        // ** 注意:此处重新实例化了一个对象
        person = new Person();
        person.setAge(20);
        person.setName("java");
    }
}

在这里插入图片描述

问题:发现此时代码的结果与** 2.1 **并不相同
原因:形参在方法中重新实例化了一个对象,person = new Person()
此时实参与形参指向的并不是同一个堆内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值