代码之家  ›  专栏  ›  技术社区  ›  DontPanic

Java:通过方法调用修改对象[复制]

  •  0
  • DontPanic  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我已经读了很多次,在Java中,传递给方法的参数不能被方法修改。尽管如此,我发现 可以 修改我创建的对象,而不是Java对象。考虑以下代码:

        // My Integer Object
        class MyInteger {
            Integer val;
        }
    
        // Change Java Object
        public void test1() {
            Integer intval;      // Integer object
            intval = 123;
            setInteger( intval );       // THIS DOESN'T WORK
    
            TTY.putR( "Integer Object="+intval);
        }
    
        // Change My Object
        public void test2() {
            MyInteger myInt;    // MyInteger object
            myInt = new MyInteger();
            myInt.val = 456;
            setMyInteger( myInt );      // THIS WORKS!
    
            TTY.putR( "MyIntegerObject=" + myInt.val );
        }
    
        // Set an Integer object
        public void setInteger( Integer val) {
            val = 888;
        }
    
        // Set a MyInteger object
        public void setMyInteger( MyInteger myint) {
            myint.val = 999;
        }
    

    测试1 不像我被警告的那样工作。但是 测试2 工作很好。嗯, 两者都是对象 并通过引用传递。为什么一个有效,另一个无效?(注:TTY是我的打印功能)

    5 回复  |  直到 6 年前
        1
  •  3
  •   arcy    6 年前

    你要么读错了东西,要么误解了别人对你说的话。

    如果将“A”传递给Java方法,则不能将方法更改“A”改为“A”。但是,您可以修改“a”。

    换句话说,不能创建与“a”类相同的对象,并返回该对象来代替“a”。返回方法创建的对象的唯一方法是在传递给方法的对象中放置对该新对象的引用的位置,或者将其作为方法的返回值返回。

        2
  •  0
  •   Jamie Bisotti    6 年前

    我认为你混淆了旁路参考和旁路值。读 this 帮助清理。

    你可能也误解了你所读到的。一个可变的对象可以在任何地方——在创建它的地方或者通过传递它的方法进行变异。

    祝你好运。

        3
  •  0
  •   Hatice    6 年前

    Java是一种按值传递语言。当您使用参数调用任何方法时,它将创建新的变量,并且您正在更改该变量。

    你也可以看看这个, Is Java "pass-by-reference" or "pass-by-value"?

        4
  •  0
  •   Gatusko    6 年前

    因为myinteger,所以val是一个公共变量。所以任何人都可以修改它。

     // Change MyInteger object
        public void setMyInteger( MyInteger val) {
            val.val = 999;  // ACCESING TO A PUBLIC VAR and SETTING IT
        }
    
    // Change an Integer object
    public void setInteger( Integer val) {
        val = 888; // Accesing to the value of the Variable and not modifing it
    }
    
        5
  •  0
  •   Grey Haven    6 年前

    我看到的最好的解释是:

    传递一个指向内存地址P的对象A。

    A===>P

    当您通过执行修改时 A.foo = bar ,a仍指向p,因此p处的对象的属性foo已更改。但是,假设您想要完全重新分配,那么就这样做。 A = new MyCoolObject() . 这意味着

    新建

    因此,当您通过执行 a.foo=巴 ,a不再指向p,因此p_new处的对象的属性foo已更改, 但P点的物体保持不变。 这意味着当您退出该方法并返回到任何父级调用该方法时,a将完全不变。

    免责声明:我在5年前的另一篇堆栈溢出文章中看到了这一点,我太懒了,找不到它。如果你现在正在读这篇文章,而你正是写这篇文章的人,谢谢,原谅我的随意抄袭。