Java:通过方法调用修改对象

时间:2018-05-21 20:24:57

标签: java methods parameter-passing

我已经读了很多次,在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;
    }

test1 因为我受到警告而无法正常工作。但是 test2 工作正常。 AFAIK,都是对象并通过引用传递。那怎么一个人工作而另一个人不工作呢? (注意:TTY是我的打印功能)

5 个答案:

答案 0 :(得分:3)

你要么读错了,要么误解了你被告知的事情。

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

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

答案 1 :(得分:0)

因为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
}

答案 2 :(得分:0)

我认为你被传递引用与传递值相混淆。请阅读this以帮助清除它。

您可能也误解了您所阅读的内容。可变对象可以在任何地方进行变异 - 创建它或者传递给它的方法。

祝你好运。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我看到这个解释的最佳方式是:

传递指向内存地址P的对象A.

A ===> P

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

P_New< === A == / => P

因此,当您通过执行A.foo = bar修改A时,A不再指向P,因此P_New中的对象的属性foo已更改,但P处的对象保持不变。这意味着当您退出方法并返回到任何称为方法的父级时,A将完全不变。

免责声明:我在5年前的另一篇Stack Overflow文章中看到了这一点,并且懒得找到它。如果你现在正在阅读这篇文章,那么你就是写这篇文章的人,谢谢,并原谅我的随意抄袭。