如何在Main方法中声明静态变量?

6

我们能在Main方法内声明Static变量吗?因为我收到了一个错误消息:

Illegal Start of Expression

2
请粘贴相关的代码。 - Jeff Swensen
2
如果像一些评论者所建议的那样,你的问题是受到你可以在C语言中实现这个功能的启发,那么你应该在问题中指出这一点,以便回答者可以通过指出Java和C之间的区别来帮助你。 - Tyler
如果我们知道你为什么需要在方法内使用静态变量,或许我们可以更好地回答你的问题。在方法内声明的所有变量都只在该方法中有效。请告诉我们你想解决的问题,我相信我们可以为你提供一些好的答案。 - CoolBeans
6个回答

33

显然不行。

在Java中,static表示它是一个类的变量/方法,它属于整个类而不是其中某个特定的对象。

这意味着 static 关键字只能在“类范围”内使用,即它在方法内没有任何意义。


2
它在C函数中可能具有的含义是静态局部变量:在函数内部声明为静态的变量在静态分配时具有与自动局部变量相同的作用域。因此,当函数再次被调用时,函数放入其静态局部变量的任何值仍将存在。 - functional
1
@functional:我的建议基于问题附近的java标签。 - Roman
3
好的,我明白了。我只是在说将其放在方法内部也可能有意义。仅此而已。 - functional
啊,我明白了。我不知道在C语言中你可以这样做。但是在Java中,你肯定不能这样做。 - Tyler
1
@functional - 如果你认为在C语言中也有意义,那么它只有在Java中才有意义。就个人而言,我认为这是C语言语法上的缺陷。这是一种笨拙的方式,用可见性修饰符来实现Java和C++所做的事情。 - Stephen C

6
你可以在main方法(或任何其他方法)中使用静态变量,但需要在类中声明它们:
这是完全可以的:
public Class YourClass {
  static int someNumber = 5;

  public static void main(String[] args) {
    System.out.println(someNumber);
  }
}

这也可以,但在这种情况下,someNumber 是一个局部变量,而不是静态变量。

public Class YourClass {

  public static void main(String[] args) {
    int someNumber = 5;
    System.out.println(someNumber);
  }
}

6
由于静态变量在类加载时分配内存,并且内存只分配一次。现在,如果你将静态变量置于方法内部,则该变量处于方法的作用域而不是类的作用域范围内,因此JVM无法为其分配内存。因为方法是通过类的对象调用的,在运行时而不是在类加载时被调用。

3
由于静态变量可供整个类使用,因此在概念上它只能在其范围为全局的类之后声明,而静态块或方法则具有自己的作用域。

2

在C语言中,你可以拥有静态分配的本地作用域变量。不幸的是,在Java中这种方式不被直接支持。但是你可以通过使用嵌套类来实现相同的效果。

例如,下面的代码段是允许的,但是它是糟糕的工程实践,因为x的范围比它需要的要大得多。而且两个成员(x和getNextValue)之间存在一个不明显的依赖关系。

static int x = 42;
public static int getNextValue() {
    return ++x;
}

以下操作看起来很不错,但是它是不合法的:

public static int getNextValue() {
    static int x = 42;             // not legal :-(
    return ++x;
}

然而,你可以选择这样做:
public static class getNext {
    static int x = 42; 
    public static int value() {
        return ++x;
    }
}

在牺牲一些美观度的情况下,更好的工程设计。


2

你不能这样做,为什么要这样做呢?你可以在类级别上声明它,这是它所属的位置。


1
在C和C++中,方法内的静态变量是合法的,也许这就是他的背景。 - Matt Greer
我知道,但Java不是C++ :) 在C/C++中,静态变量的优点是在函数结束后不会被删除,因此您可以将它们传递到任何地方。使用Java的垃圾回收器,您只需随意传递变量,无需担心任何问题,这就是为什么我问他的观点是什么。感谢您的评论。 - Karel Petranek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接