繁体   English   中英

如何在 Java 中创建静态局部变量?

[英]How do I create a static local variable in Java?

我读过 Java 不支持与 C/C++ 不同的static局部变量。 现在,如果我想用一个局部变量编写一个函数,它的值应该在函数调用之间保持不变,我该怎么做?
我应该求助于使用实例变量吗?

您可以拥有一个静态类变量,该变量将在该类的所有实例中保留。 如果那是你想要的。 如果不是,请使用实例变量,该变量仅在此对象的方法调用之间保留。

public class Foo {
   static int bar;
   //set bar somewhere

   public int baz() {
      return 3 * bar;
   }
} 

如果要在函数调用之间重用变量值并将此变量与其他方法隔离,则应将其封装在对象中。 首先,定义一个只包含“类似静态”变量的类和您需要的函数:

class MyFunctionWithState {
    private int myVar = 0;
    public int call() {
      myVar++;
      return myVar;
    }
 }

然后,从您的客户端代码:

class Foo {
    private MyFunctionWithState func = new MyFunctionWithState();
    public int bar() {
      return func.call();
    }
 }

现在,如果func依赖于Foo的内部状态,你可以通过call()传递相关数据,或者传递一个Foo实例,让函数调用相应的getter:

class MyFunctionWithState {
    private int myVar = 0;
    public int call( Foo f ) {
      myVar += f.getBaz();
      return myVar;
    }
 }

class Foo {
    private MyFunctionWithState func = new MyFunctionWithState();
    public int bar() {
      return func.call( this );
    }
    public int getBaz() {  /*...*/  }
 }

局部变量是方法中的变量。 只有方法才能访问这些变量。 您不能拥有静态局部变量,但可以使用实例变量或类变量。

如果您的方法是静态的,默认情况下会为所有对象创建此方法的副本,并且无法进一步细分,因为局部变量仅限制它们访问它们所在的方法。

我应该使用实例变量吗?

是的 - 毕竟,这就是实例变量的用途。 它们将状态存储在对象方法的调用之间。 拥有静态类变量可以实现相同的结果,但可以使您的程序更加耦合,更难以测试/模拟/维护。

在下面的示例中, count行为类似于静态局部变量,您可以在C中使用它:

public class Foo {

   private int count = 0;

   public int getCount() {
       return count++;               
   }
} 

没有其他语言支持的静态局部变量。 由于java非常“面向”,它试图将它带到该上下文。 如果要模拟该行为,请使用仅由此方法使用的实例变量。 所以这对于不同的方法调用是静态的,而不是对于类本身。

你要么标记答案是否正确,或者你实际上想要静态类变量 - 但正确答案基本上是Levit,或者技术上是所有答案的混合。

对于像我这样的C背景的人来说,真正想要静态函数 - 局部变量纯粹是为了比全局变量的范围优势,似乎答案是你不能用Java。 并非没有像@paradigmatic这样的东西,一个具有静态全局和getter()的类的实例,对于您正在运行函数的类的实例是唯一的。

如果,正如我怀疑的那样,你是以单身人士的身份运行课程,或者完全静态地像我们所有人开始的那样,@ Ellie P或@ user2626445的答案可以正常工作,因为没有其他实例会搞砸你的全球。 但是要实现我认为它是你想要它实际上应该只是一个实例变量,它是C中的全局变量。它们在函数调用之间保持不变但允许你的函数以OO方式使用,因此多个实例可以保持自己的此特定函数的持久变量。

就个人而言,我在jave中解决这个问题,就像我在Hi-Tech C中不允许函数位变量一样,通过在函数声明上方声明文件中的全局。 这样,当我以后破解代码时,我不太可能认为它是全局的,并且很容易被它弄乱 - 这不是我们封装东西的原因吗?

免责声明:仅仅因为你可以,并不意味着你应该

尽管 Java 不支持静态局部变量,但在最新版本的 Java 中很容易模拟。 从 Java 16 开始,可以在方法中创建具有可变静态字段的本地类。 随后,您像在 C/C++ 中一样改变本地类的静态字段。

public class Main {

    public void foo() {
        class Local {
            static int count = 0;
        }
        Local.count++;
    }
    
}

在 Java 16 之前,本地类可能只包含静态常量。

final int intVar = 1; //只会出现一次 在方法中表现为C ++静态局部变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM