java 引用传递、返回 疑惑
高洛峰
高洛峰 2017-04-17 13:36:12
0
8
418

代码如下:

public static void main(String[] args) {
        DispatcherServlet dispatcherServlet = new DispatcherServlet();
        A a = dispatcherServlet.new A("bb");
        dispatcherServlet.da(a); // 此行执行完毕,a.getA()值是bb
        System.out.println(a.getA());
    }

    private A da(A a) {
        a = new A("aaaaa");
        return a;
    }

    class A {
        private String a;

        public A(String a) {
            this.a = a;
        }

        public String getA() {
            return a;
        }

        public void setA(String a) {
            this.a = a;
        }

    }

疑惑如注释。为何da方法里的new值回到main后会丢失?

经学习得出以下结论:

  1. java只有值传递,没有引用传递
  2. 非原始类型也是值传递,传递的是值是该引用,为副本

因此:

  1. 在da中修改a的属性值,可以在da方法外生效。
  2. 在da中修改a的引用(重新对a赋值),修改的是引用副本。在da方法外不生效!

希望对其它碰到这种问题的人,不明所以的人有所帮助!!哈哈\(^ ^)/

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(8)
巴扎黑

虽然说, java没有把指针明文写出来, 但是还是有用到指针的.
dispatcherServlet.da(a); // 这里虽然写的是a这个对象, 但是在方法里使用的是引用

private A da(A a) { // 这里是一个指针对象, 指向上方传入的 那个对象
    a = new A("aaaaa"); // 这里只是改变了 指针对象 并没有修改 源对象.
    return a; // 如果你想获得新的对象, 那就取这个返回值来用吧.
}

java里面分为对象, 和 对这个对象的引用对象(或者说指针?).
举例:
仓库里的货a, 和这个a货的清单 qd_a, 清单上写了a货在哪个仓库, 哪个区域的哪个位置.
有人把qd_a上的数据改了, 指向了货b, 但是货a却没有受影响, 受影响的是 qd_a这个清单.

这是我理解的.不知道解释清楚了没.. 希望指正.

いいねを押す +0
迷茫
    private A da(A a) {
        a = new A("aaaaa");
        return a;
    }

把这里的a改为成员变量即可

いいねを押す +0
阿神
Cprivate:
    A da(A &a) {
        a = new A("aaaaa");
        return a;
    }

Java是没有引用传递的,也就是说Java不可能让你把整个参数的引用给替换掉。C/C++有引用传递,不过你必须要在参数的前面加上&符号。

いいねを押す +0
Peter_Zhu

java传值,不是传引用,只不过传的是指针的值,所以看起来像引用。。。

da里面

a = new A("aaaaa");

这一句是反映不到函数外面的,a的值(地址)在函数内修改了是没用的,但a的内容可以修改
比如da里面如果有

a.setA("aaaaa");

那你在函数外面打印出来的值就是"aaaaa"了

和这样的C++等价

void f(A *a) {
    a = new A("aaaaa");
}

void main() {
    a = new A("bb");
    f(a);
    cout << a.getA(); // "bb"
}
いいねを押す +0
左手右手慢动作

java只有值传递,没有引用传递
正解,传对象的时候一定要记住你传的不是这个对象自己的内存地址,而是这个对象的值,而这个值就是这个对象引用的地址

いいねを押す +0
刘奇

我感觉java传递参数的是分情况的吧,
对容器对象比如Map,是传递了引用而不是复制了值
在函数中对map容器的处理是会变化到原始原始调用者, 这就不能叫传值了吧...
简单类型是传值没错

いいねを押す +0
伊谢尔伦

09年的帖子
http://ivan-pig.iteye.com/blog/422891
是否能解决lz的疑问?

いいねを押す +0
黄舟

对于非原始类型,引用放在栈上,对象本身放在堆上,栈上的引用会复制一份,对象不复制。

java如果想实现引用传递,可以用boxing,即用数组来存取。

private void foo(int[] iarr)
{
    int ival = iarr[0];
    // ...
    iarr[0] = ival;
}
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!