如果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按值调用。使用点引用值时,保留复制的值(对象引用)并引用对象。这在其他语言中称为指针。可能与