如果Java是“按值调用”语言,那为什么会发生这种情况呢?

时间:2017-03-16 07:22:32

标签: java object reference pass-by-value

参见测试代码:

npm i -g npm less

结果如下:

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 Java,因此call by value的{​​{1}}属性应保持为0.

我认为这是由于创建了一个对象num,它将包含一个对象Node。但T中没有用于保存N类似对象的属性。那怎么回事?

非常感谢任何帮助。

月亮。

4 个答案:

答案 0 :(得分:3)

Java通过引用传递对象。 Node N是一个对象。所以当你执行N.num++时,你会增加同一个对象的整数。

答案 1 :(得分:1)

Javareferences按值传递的意义上的按值调用。

这意味着您可以更改传递的对象的内部状态N(例如,通过修改num字段的值),但无法将N重新分配给新的N = 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

在第二种情况下,只有传递给方法的引用才会更改,因此仅在方法体中可见(myiosclass.h将不再在此处引用原始对象),而是原始对象保持不变。

答案 2 :(得分:0)

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

保持num的值,初始值为0, 并且当num的调用函数和增量值每次num的值都会因同一个Node类对象而增加时。它易于理解的节点对象是类Node的实例,如果你创建另一个Node类对象,它将是类的不同实例。

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

答案 3 :(得分:0)

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