参见测试代码:
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
类似对象的属性。那怎么回事?
非常感谢任何帮助。
月亮。
答案 0 :(得分:3)
Java通过引用传递对象。 Node N
是一个对象。所以当你执行N.num++
时,你会增加同一个对象的整数。
答案 1 :(得分:1)
Java
是references
按值传递的意义上的按值调用。
这意味着您可以更改传递的对象的内部状态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引用。因此,当您调用方法时,相同的值会增加。