我刚刚开始学习Java,我对我正在研究的一些练习代码有疑问。基本上,我无法理解为什么我们在这种情况下的输出是7 14而不是14 14.代码如下:
class Test {
static int s;
public static void main (String [] args)
{
Test p = new Test();
p.start();
System.out.println(s);
}
void start()
{
int x = 7;
twice(x);
System.out.print (x + " ");
}
void twice (int x)
{
x = x* 2;
s = x;
}
}
答案 0 :(得分:4)
如果我们将twice
方法重新编写为
void twice (int y)
{
y = y * 2;
s = y;
}
x
中的start
与x
中的twice
完全无关。
答案 1 :(得分:1)
因为您在此处打印x
,
twice(x);
System.out.print (x + " "); // <-- x
x
中修改的twice
的值与来电者x
的值不同。所以x
仍然是7。
如果你这样做了,
System.out.print (s + " "); // <-- not x
你会得到你期望的输出。
答案 2 :(得分:1)
在java中,当您传入原始数据类型时,实际引用不会传入;传入值的副本,该副本独立于原始值的引用。
所以: x在start()方法中是本地的7。 运行two()方法时,会在本地生成x(值为7)的副本,然后加倍。然后为静态变量s赋值(十四)。最后,打印x(在开始时),然后打印静态值,其值为7.
答案 3 :(得分:0)
因为函数中的参数范围两次(int x)在函数内。分配的值不会全局反映。它会将参数作为副本发送。这种方式称为按值传递。
因此您必须将其分配给某个全局变量以获取结果或使函数通过更改返回类型来返回结果。
答案 4 :(得分:0)
每次写int x
时,都会得到一个新变量。因此,当您在int x = 7;
方法中编写start
时,您获得了一个变量。然后,当您在(int x)
方法的顶部编写twice
时,您获得了第二个变量。它们具有相同名称的事实无关紧要 - 这是两个不同的变量。
现在,当您在twice(x)
方法中编写start
时,会将值7
从第一个x
变量复制到第二个x
变量。之后,您对第二个x
所做的任何更改都不会影响第一个{{1}}。
答案 5 :(得分:0)
尝试修改x的int返回方法,而不是只影响s变量的void方法,如下所示:
class Test {
static int s;
public static void main (String [] args)
{
Test p = new Test();
p.start();
System.out.println(s);
}
void start()
{
int x = 7;
x = twice(x);
System.out.print (x + " ");
}
int twice (int value)
{
int result = value* 2;
s = result;
return result;
}
}
由于java是基元的值传递(例如int,boolean等)和对象的pass-by-reference,你必须返回一些东西,看看这个blog,它解释了更多关于