Java引用传递

2018-06-29  本文已影响0人  dlstone

以一个问题开始:如果在函数的入参中传递一个对象,然后在函数内部将这个对象置空,请问原始的对象是否为空?下面我们来验证这个问题:

public static void main(String[] args) {
        Entry entry = new Entry("name");
        updateEntry(entry);
        System.out.println("updateEntry " + entry.getName());

        Entry entry2 = new Entry("name");
        repalceEntry(entry2);
        System.out.println("repalceEntry " + entry2.getName());

        Entry entry3 = new Entry("name");
        emptyEntry(entry3);
        if (entry3 != null) {
            System.out.println("emptyEntry " + entry3.getName());
        }
        else {
            System.out.println("emptyEntry");
        }
    }

    private static void updateEntry(Entry entry)
    {
        entry.setName("aaa");
        System.out.println(entry.getName());
    }

    private static void repalceEntry(Entry entry)
    {
        entry = new Entry("aaa");
        System.out.println(entry.getName());
    }

    private static void emptyEntry(Entry entry)
    {
        entry = null;
    }

运行结果如下:

aaa
updateEntry aaa
aaa
repalceEntry name
emptyEntry name

结果表明:
引用传递可以修改参数对象的内部状态,但是对参数对象重新赋值是没有意义的;
Java入参,对象传递的是引用的副本,副本的概念其实就是按值传递,所以对象的属性值可以改变,但是引用无法改变,注意与C++区别;

答案:原始对象不为空;

网上有两种争论,入参对象按引用传递,那么是指传递对象的引用;入参对象按值传递,则指传递引用的值,不是对象的值;从上面的例子中,观察其在不同场景下的输出,理解其实质,知道啥时变,啥时不变。

上一篇下一篇

猜你喜欢

热点阅读