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>,它的定义就反映在该类变量中,因为这是修改过的。我猜你的意思是别的,但我不确定是什么。“一个静态变量对一个类的所有实例都是通用的”-我通常认为这是一种误导性的解释静态变量的方式。这在某种程度上意味着必须有一个类的实例。相反,我更愿意将其解释为“静态变量与类本身相关联,而不是特定于类的单个实例”。