将对象引用传递给java中的方法时,成员正在更新,但引用保持不变。为什么?

将对象引用传递给java中的方法时,成员正在更新,但引用保持不变。为什么?,java,oop,methods,Java,Oop,Methods,info.name和info.phone在传递到defaultEntryInfo infoObject后正在更改,但引用未更改为null为什么?有人能解释一下这个场景以及java方法的工作原理吗。c函数和java方法的工作机制有什么区别吗? 提前感谢: class Info { String name = "Sagar Pudi"; String phone = "9999999999"; } public class MemberDeta

info.name和info.phone在传递到defaultEntryInfo infoObject后正在更改,但引用未更改为null为什么?有人能解释一下这个场景以及java方法的工作原理吗。c函数和java方法的工作机制有什么区别吗? 提前感谢:

   class Info {
        String name = "Sagar Pudi";
        String phone = "9999999999";
    }

    public class MemberDetails {
        public void defaultEntry(Info infoObject) {
            infoObject.name = "DEFAULT_MEMBER";
            infoObject.phone = "NO_PHONE";
            infoObject = null;
        }

        public static void main(String[] args) {

            Info info = new Info();
            System.out.println("Before : " + info.name + "<->" + info.phone);

            MemberDetails md = new MemberDetails();
            md.defaultEntry(info);
            System.out.println("After  : " + info.name + "<->" + info.phone);
            if (info != null)
            System.out.println("info  is still an object of " + info.getClass());
        }
    }
输出:

Before : Sagar Pudi<->9999999999
After  : DEFAULT_MEMBER<->NO_PHONE
info  is still an object of class Info

Java的引用是按值传递的。i、 例如,引用本身被复制

因此,对传递的引用(而不是引用所引用的对象)所做的任何更改都不会反映在原始对象引用上。

看看AtomicReference类包装器。这就是你想要的。当从函数中修改对象时,不能直接将引用设为null,因为实际上您使用的是指向该对象的指针的副本,所以设为null对方法的调用方没有任何作用

变成

    public void defaultEntry(AtomicReference<Info> atomicInfoObject) {
        atomicInfoObject.get().name = "DEFAULT_MEMBER";
        atomicInfoObject.get().phone = "NO_PHONE";
        atomicInfoObject.set(null);
    }

这里有两个ReferenceInfoObject,一个objectInfo的信息,因为java引用是按值传递的


将引用设为null意味着它不指向任何对象。因此,在您的情况下,如果将null赋值给INFOBJECT变量,info变量仍将保留对info类对象的引用。

java中没有传递引用的概念。引用也使用传递值策略进行复制。在上面的例子中,变量info引用值被复制到被调用方法中的infoObject。因此,当方法体从调用到函数返回执行时,我们有两个引用变量info和infoObject,理想情况下它们指向内存中的同一个数据对象。因此,如果我们对任何一个对象数据进行更改,它都会反映在两个对象中。当你

    infoObject = null;
它只是将引用变量设为反引用。静态变量info保存有效对象。

换句话说,defaultEntry中的INFOBJECT变量最初是对同一对象的不同引用。该方法可以查看和更改对象本身,但无法查看或更改调用方对该对象的引用。
public void defaultEntry(Info[] infoObject) {
    infoObject[0].name = "DEFAULT_MEMBER";
    infoObject[0].phone = "NO_PHONE";
    infoObject[0] = null;
}
    infoObject = null;