一个多数程序员都会犯的错:Java方法传参的问题

不是危言耸听,这道题很多人都做错,其中很多是资深开发人员。

请问下面程序运行后输出什么:
A、老唐 B、令狐冲 C、杨过 D、郭靖

public class Test {
    public static void main(String[] args) throws Exception {
        Member me = new Member();
        me.setId(1);
        me.setName("老唐");
        chuanyue(me);
        System.out.println(me);
    }
    // 方法chuanyue,即:穿越
    public static void chuanyue(Member member) {

        member.setId(1001);
        member.setName("令狐冲");

        Member member_other = new Member();
        member_other.setId(1002);
        member_other.setName("杨过");

        member = member_other;

        member.setId(1003);
        member.setName("郭靖");
    }

}

class Member {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Member [id=" + id + ", name=" + name + "]";
    }

}

答案是: B、令狐冲
你答对了吗?

分析:

当我们调用chuanyue(me)时,函数内部会做一个隐式操作:member=me;
关键就在member=me这里:在java中,给对象赋值是传递的对象地址(指针变量)!

因此member=me就让member和me指向了同一个对象,操作member相当于操作me。
当执行

member.setId(1001);
member.setName("令狐冲");

相当于执行

me.setId(1001);
me.setName("令狐冲");

就是在这里,me对象变成了令狐冲了

接下来创建了一个对象member_other,然后调用

member = member_other;

这一句让member和member_other指向了同一个对象,操作member相当于操作member_other
所以这时执行

member.setId(1003);
member.setName("郭靖");

相当于执行

member_other.setId(1003);
member_other.setName("郭靖");

然后方法结束,局部变量member,member_other被销毁
最终me就是令狐冲

不啰嗦,看下图理解:

这里写图片描述


指针的指针

我问有些回答错误的人,他们大多数答案是 D、郭靖。
其关键是认为在方法内部调用member = member_other;时,会让me也指向member_other。简单的说,他们认为member的一切改变都会影响me。
这实际上理解的最大误区就在于:认为方法形参向实参传递时,是传递了指针的指针。
不过,在有些情况下如果你想做到方法形参的任何改变,都会影响实参,那确实就必须要传递指针的指针。

方法参数传递指针的指针的情况

见图解:
这里写图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值