Java 静态变量永远不会更新
我试图给Java 静态变量永远不会更新,java,Java,我试图给ans变量分配一个新值,但它从未更新过。我运行了许多输入(x,n),但显示了结果x最终答案。有人能解释一下吗 public class Solution { static int ans = 1; public static int power(int x, int n) { if(n==0) return 1; if(n==1) return x; ans = ans
ans
变量分配一个新值,但它从未更新过。我运行了许多输入(x,n),但显示了结果x最终答案。有人能解释一下吗
public class Solution {
static int ans = 1;
public static int power(int x, int n) {
if(n==0)
return 1;
if(n==1)
return x;
ans = ans * power(x,n-1);
return ans;
}
}
ans = x * power(x, n-1);
ans = x * power(x, n-1);
静态变量与类本身相关联。如果该类有更多实例,则所有实例都共用一个静态变量。但是,在递归过程中,对于每个函数调用,都会将一个新的堆栈帧推送到堆栈内存中,所有变量都在该方法中 在您的情况下,对于创建多个副本的每个递归函数调用,变量
ans
将被复制到堆栈中(是,即使是静态的)。因此,如果通过递归调用在堆栈中修改ans
,则(父)调用函数中的ans
值不会受到影响
对于power(2,3)
power(2,3) ans=1
power(2,2) ans=1
power(2,1) ans=1 -> returns 2
ans * 2 -> returns 2 because ans is still 1
ans * 2 -> returns 2 because ans is still 1
这是函数的简化版本,不使用额外变量:
public static int power(int x, int n) {
if (n == 0)
return 1;
if (n == 1)
return x;
return x * power(x, n - 1);
}
静态变量与类本身相关联。如果该类有更多实例,则所有实例都共用一个静态变量。但是,在递归过程中,对于每个函数调用,都会将一个新的堆栈帧推送到堆栈内存中,所有变量都在该方法中 在您的情况下,对于创建多个副本的每个递归函数调用,变量
ans
将被复制到堆栈中(是,即使是静态的)。因此,如果通过递归调用在堆栈中修改ans
,则(父)调用函数中的ans
值不会受到影响
对于power(2,3)
power(2,3) ans=1
power(2,2) ans=1
power(2,1) ans=1 -> returns 2
ans * 2 -> returns 2 because ans is still 1
ans * 2 -> returns 2 because ans is still 1
这是函数的简化版本,不使用额外变量:
public static int power(int x, int n) {
if (n == 0)
return 1;
if (n == 1)
return x;
return x * power(x, n - 1);
}
显示你的单元测试为什么你想要一个静态变量,在这里?只需使用一个局部变量…显示您的单元测试为什么您甚至想要一个静态变量,在这里?只需使用一个局部变量…我知道修正,但我想知道为什么静态变量不更新。Hi@Pulkit我更新了我的答案。我认为这是一个有趣的问题,它显示了堆内存和堆栈内存之间的区别。我希望答案现在已经足够清楚了。这与
ans++;ans=ans*功率(x,n-1)代码>ans
在递归调用函数之前得到更新,因此更新后的值被复制到堆栈中。请考虑接受我的回答:“因此,如果在堆栈中修改了ANS,那么值就不会反映在类变量中。”这是没有意义的:如果修改了<代码> ANS/COD>,它的定义就反映在该类变量中,因为这是修改过的。我猜你的意思是别的,但我不确定是什么。“一个静态变量对一个类的所有实例都是通用的”-我通常认为这是一种误导性的解释静态变量的方式。这在某种程度上意味着必须有一个类的实例。相反,我更愿意解释为“静态变量与类本身相关,而不是特定于类的单个实例”。我知道更正,但我想知道为什么静态变量不更新。Hi@Pulkit我更新了我的答案。我认为这是一个有趣的问题,它显示了堆内存和堆栈内存之间的区别。我希望答案现在已经足够清楚了。这与ans++;ans=ans*功率(x,n-1)代码>ans
在递归调用函数之前得到更新,因此更新后的值被复制到堆栈中。请考虑接受我的回答:“因此,如果在堆栈中修改了ANS,那么值就不会反映在类变量中。”这是没有意义的:如果修改了<代码> ANS/COD>,它的定义就反映在该类变量中,因为这是修改过的。我猜你的意思是别的,但我不确定是什么。“一个静态变量对一个类的所有实例都是通用的”-我通常认为这是一种误导性的解释静态变量的方式。这在某种程度上意味着必须有一个类的实例。相反,我更愿意将其解释为“静态变量与类本身相关联,而不是特定于类的单个实例”。