如果Java是一个;“按值调用”;那么为什么会发生这种情况呢?

如果Java是一个;“按值调用”;那么为什么会发生这种情况呢?,java,object,reference,pass-by-value,Java,Object,Reference,Pass By Value,请参阅测试代码: 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 Te

请参阅测试代码:

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
callbyvalue
,那么
Node
num
属性应该保持为0

我认为这是由于创建了一个对象
T
,它将包含一个对象
N
。但是,
T
中没有保存类似
节点的对象的属性。那么这是怎么发生的呢

任何帮助都会受到恶意的感激


Moon.

Java通过引用传递对象<代码>节点N
是一个对象。因此,当您执行
N.num++
操作时,您正在递增同一对象的整数。

Java通过引用传递对象<代码>节点N是一个对象。因此,当您执行
N.num++
时,您正在递增同一对象的整数。

在您的代码中,您有一个类节点的对象

保存初始值为0的
num
值, 当调用函数和
num
的增量值时,
num
的每次值都会因为相同的节点类对象而增加。它很容易理解节点对象是类节点的实例,若您创建另一个节点类对象,它将成为不同的类实例

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的
num
值, 当调用函数和
num
的增量值时,
num
的每次值都会因为相同的节点类对象而增加。它很容易理解节点对象是类节点的实例,若您创建另一个节点类对象,它将成为不同的类实例

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

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

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

Java
是按值调用的,即
引用
是按值传递的

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


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

Java
是按值调用的,即
引用
是按值传递的

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


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

您看到了吗:?N按值调用。使用点引用值时,保留复制的值(对象引用)并引用对象。这在其他语言中称为指针。您是否看到可能的重复:?N按值调用。使用点引用值时,保留复制的值(对象引用)并引用对象。这在其他语言中称为指针。可能与