开发者社区> 问答> 正文

Java函数中修改引用的指向会不会影响实参?

public class TestMain {
    public static void main(String[] args) {
        Person p1 = new Person(10);
        modify(p1);  //修改p1引用的对象
        System.out.println(p1);
    }
    public static void modify(Person p){ //使用此函数修改引用的指向
        p = new Person(20);
    }
    

}
class Person {   //实验用类
    public int age;

    @Override
    public String toString() {
        return "Person [age=" + age + "]";
    }

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

输出结果为什么是 Person [age=10]不应该是Person [age = 20] 么?

展开
收起
蛮大人123 2016-03-05 16:24:38 2262 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    我按照执行顺序给你写注释好了。

    Person p1 = new Person(10);
    //创建了一个对象
    //p1.age=10;
    
    modify(p1); 
    //modify函数传参,创建了一个在modify函数里面的局部变量p
    //你应该明白p是一个新的变量,这里类似于执行了p=p1,这两个是指向的同一个对象的
    //p.age=10;
    
    p = new Person(20);
    //注意,这里!这里!
    //这里是p被重新赋值了,p指向了新的对象new Person(20);
    //p.age=20;
    //和p1指向的那个对象一毛线关系都没有啊

    所以,你的代码是在函数内部,把局部变量给重新赋值了。
    是没法修改到外面的对象的,因为你已经把唯一能访问到外面那个p1的p给重新赋值了!
    `
    public static void modify(Person p){
    p.age=20; //只有这样才能修改对象!
    }
    `
    同理,如果你写成这样:
    `
    public static void modify(Person p){
    p = null;//对外面的p1没有任何影响
    }
    `
    我举个例子,你就比较好理解了。
    你创建了一个100000000个元素的数组,比如就叫p1,你把数组通过参数传进函数里面,那么:
    这个参数p(类似于p = p1),p和p1他们是指向同一个对象。
    不是说modify(int[] p)重新创建了100000000个元素的数组。
    这个应该很好理解。
    那么:
    然后你通过p的内置函数怎么操作p都行,都是操作的那100000000个元素的数组。
    但是,你不能把p重新赋值啊。
    重新赋值它就不是之前那个数组啦!

    比如:
    你重新p = new int[100000000],就创建了一个新的100000000个元素的数组啊。
    你执行p = null,也只是销毁了这个引用,不让它指向100000000个元素的数组而已。
    对外面p1的那个数组不会再有任何影响了。

    关于JAVA的函数传参数,你应该也听说过,所谓"基本数据类型是传递的值,其它都是传递的引用"。
    个人理解是这样的。
    你传递个Person的对象进去,你可以用SetAge()什么的修改这个对象。
    但是基本的数据类型,比如Integer、String等等,他们没有什么内置函数能改变他们自己。
    所以,你传递进去一个int的参数,就算其实是传递的引用,你也只能对int做重新赋值,一重新赋值,就表现成传递的是"值"(永远影响不到函数外面)。

    2019-07-17 18:53:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载