如果 Java 是一种“按值调用”的语言,那么为什么会这样呢?

If Java is a "call-by-value" language then why is this happening?

提问人:Mooncrater 提问时间:3/16/2017 最后编辑:aUserHimselfMooncrater 更新时间:3/16/2017 访问量:97

问:

请参阅测试代码:

class Node
{
    int num = 0;
}

class TestPassByReference
{
    void increaseByOne(Node N)
    {
        N.num++ ;
    }

    public static void main(String args[])
    {
        Node N = new Node() ;
        TestPassByReference T  = new TestPassByReference() ;
        T.increaseByOne(N) ;
        System.out.println("num = "+N.num) ;
        T.increaseByOne(N) ;
        System.out.println("num = "+N.num) ;
        T.increaseByOne(N) ;
        System.out.println("num = "+N.num) ;
    }
}

结果如下:

num = 1
num = 2
num = 3

这里的问题是,既然是,那么属性应该保持为 0。Javacall by valuenumNode

我认为这是由于创建了一个对象,该对象将包含一个对象。但是没有属性来保存类似的对象。那么这是怎么回事呢?TNTNode

任何帮助都是恶意的。

月亮。

Java 对象 引用 值传递

评论

1赞 Matt 3/16/2017
你看到这个了吗:stackoverflow.com/questions/40480/......
0赞 Thorbjørn Ravn Andersen 3/16/2017
N 是按值调用的。当您用点引用该值时,您将保留复制的值(即对象引用)并引用该对象。这在其他语言中称为指针。
4赞 piet.t 3/16/2017
Java 的可能重复 是“按引用传递”还是“按值传递”?

答:

4赞 vallentin 3/16/2017 #1

Java 通过引用传递对象。 是一个对象。因此,当你这样做时,你是在递增同一对象的整数。Node NN.num++

0赞 Chetan Joshi 3/16/2017 #2

在您的代码中,您有 Node 类的单个 Object。

该值为初始值为 0, 而当调用函数和增量值时,每个时间值都会因为相同的Node类对象而增加。它简单易懂的节点对象是 Node 类的实例,如果你再做一个 Node 类对象,它将是类的不同实例。numnumnum

class Node
{
    int num = 0;
}
class TestPassByReference
{
    void increaseByOne(Node N)
    {
        N.num++ ;
    }
    public static void main(String args[])
    {
        Node N1 = new Node() ;
        Node N2 = new Node() ;
        TestPassByReference T  = new TestPassByReference() ;
        T.increaseByOne(N1) ;
        System.out.println("num = "+N1.num) ;
        T.increaseByOne(N1) ;
        System.out.println("num = "+N1.num) ;
        T.increaseByOne(N2) ;
        System.out.println("num = "+N2.num) ;
    }
}

然后出来的是:

num = 1
num = 2
num = 1
0赞 Vikram Pawar 3/16/2017 #3

好吧,您正在创建 Node 和 TestPassByReference 的单个对象,因此 T 引用了您之前云创建的相同 Node 引用。因此,当您调用该方法时,相同的值是 increaments。

2赞 aUserHimself 3/16/2017 #4

Java在按值传递的意义上是按值调用的。references

这意味着您可以更改传递的对象的内部状态(例如,通过修改字段的值),但不能重新分配给新对象(例如 或 )。NnumNN = null;N = new Node();

class Node
{
    int num = 0;
}

class TestPassByReference
{
    void increaseByOne(Node N)
    {
        N.num++ ;
        System.out.println("num value is:" + N.num);
    }

    void increaseByOneThenChange(Node N)
    {
        // increase by one as before
        N.num++;
        // change the reference to a new object
        N = new Node();
        System.out.println("num value is:" + N.num);
    }

    public static void main(String args[])
    {
        Node N = new Node() ;
        TestPassByReference T  = new TestPassByReference() ;
        T.increaseByOne(N) ;
        System.out.println("num = "+N.num) ;
        T.increaseByOne(N) ;
        System.out.println("num = "+N.num) ;
        T.increaseByOne(N) ;
        System.out.println("num = "+N.num) ;

       // now try this method to see the difference
       T.increaseByOneThenChange(N);
       // N here is the original object, whose `num` value was incremented
       // but the reference remains unchanged by the above method
       System.out.println("num = "+N.num) ;
    }
}

在第二种情况下,只有传递给方法的引用会发生变化,因此仅在方法的主体中可见(此处将不再引用原始对象),但原始对象保持不变。N