在Java中声明“全局”变量时,“静态”究竟意味着什么?

时间:2010-08-05 14:35:30

标签: java class static instance-variables static-variables

我多次遇到这个问题而且我从不费心去了解它为什么会发生并学习“静态”实际意味着什么。我刚刚应用了Eclipse建议并继续进行的更改。

public class Member {

 // Global Variables
 int iNumVertices;
 int iNumEdges;

 public static void main(String[] args) {

  // do stuff

  iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

  // do more stuff

 } // main end 
}

所以eclipse告诉我做static int iNumVertices;,我不知道为什么。那究竟什么是“静态”,它是如何使用的,使用“静态”的目的是什么,为什么它会给我这个问题呢?

8 个答案:

答案 0 :(得分:9)

以下是您的示例:

public class Member {

    // Global Variables
    int iNumVertices;
    int iNumEdges;

    public static void main(String[] args) {

        // do stuff

        iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices

    }
}

方法main是与类关联的静态方法。它与Member的实例无关,因此无法访问与Member实例关联的变量。对此的解决方案是 not 以使这些字段保持静态。相反,您需要使用Member关键字创建new的实例。

以下是修改后的版本:

public class Member {
    // Fields
    private int iNumVertices;
    private int iNumEdges;

    public Member(){
        // init the class
    }

    public static void main(String[] args) {
        Member member = new Member();
        member.iNumVertices = 0;
        // do more stuff
    }
}

找到自己创建全局静态的信息表明你应该仔细考虑如何设计一些东西。这不是总是错误,但它应该告诉你要考虑你在做什么。

答案 1 :(得分:4)

static 变量是在类的所有对象之间共享的变量。在您创建的 Member 的每个对象的示例中,您将获得具有其自己的 iNumVertices 值的对象。将静态与变量一起使用时, Member 的每个对象只共享一个变量。 static 方法以相同的方式工作 - 它们在所有对象之间共享。

由于 static 变量/方法对所有对象都是通用的,因此无需使类的对象访问这些变量/方法。

iNumVertices 等非静态变量属于类的对象。如果不创建对象,则无法访问它们。因此,当您从静态上下文(此处为 main 方法)访问非静态变量时,java将不知道您尝试访问哪个对象的 iNumVertices 。因此错误。

iNumVertices 设为静态,或通过创建会员对象来引用它

Member m = new Member();
m.iNumVertices = 0;

答案 2 :(得分:4)

learn what "static" actually means

实际上什么静态意味着Class变量对于该特定类的所有实例都是相同的,但是如果你想避免使用静态变量(这是一个好主意,因为静态变量被保存在内存中)你可以传递变量value trough构造函数从而避免使用static修饰符,并实现相同的效果(即在类实例化时传递相同的值)。

以下是代码示例:

public class Car{

    private int speed;

    public Car(int speed){
        this.speed = speed;
    }

}

因此,您可以在创建新实例时执行此操作:

Car car = new Car(100);

每次创建Car实例时,它都会有100的速度,从而避免静态声明private static int speed = 100;

答案 3 :(得分:2)

静态变量是类变量。该变量将有一个副本可用于该类的所有实例,并且它们将共享该变量。也可以在不引用类的特定实例的情况下使用静态成员。

更多信息:

http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

答案 4 :(得分:1)

静态变量不需要实例化类以便被访问,因此如果您尝试从静态上下文访问非静态变量,则可能会尝试访问尚未初始化/实例化的内容

答案 5 :(得分:1)

静态方法只能访问静态变量。类中有两种变量。一个是静态变量(也是类变量),另一个是实例变量。内存中只存在一个静态变量副本,但实例变量将针对每个对象进行实例化。因此,对于静态变量,所有对象都访问同一个变量,并且一个对象所做的任何更改都将反映到其他对象。 这里的问题是为什么方法必须是静态的才能访问静态变量。将方法设置为静态时,可以在不实例化该类的对象的情况下访问该方法。因此,如果此方法能够访问实例变量,那么它应该更改为哪个对象的变量?另一种方法是可能的,即非静态方法可以访问静态变量。

答案 6 :(得分:0)

静态变量对于Class的所有实例都是通用的。

注意:如前所述,这些是类变量,即所有实例共享。

这些也可以称为类级变量。 通常,您定义常量(您还需要用于定义常量的final关键字)和全局变量作为静态。

有关更多信息,请参阅: http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

http://www.roseindia.net/java/beginners/staticvariable.shtml

答案 7 :(得分:0)

静态方法中使用的每个类变量(在类体内和方法体外部声明的变量)也需要声明为静态。

可以在该类之外访问静态类变量和方法,而无需该类的实例。