7

我已经多次遇到这个问题,我从来没有费心去了解它为什么会发生并了解“静态”的实际含义。我刚刚应用了 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 
}

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

4

8 回答 8

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。解决这个问题的方法不是使这些字段成为静态的。相反,您需要创建一个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
    }
}

发现自己在创建全局静态数据表明您应该仔细考虑如何设计某些东西。这并不总是错误的,但它应该告诉你想想你在做什么。

于 2010-08-05T14:42:46.997 回答
4

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

由于静态变量/方法对所有对象都是通用的,因此不需要创建类的对象来访问这些变量/方法。

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

要么将iNumVertices 设为静态,要么通过创建 Member 对象来引用它

Member m = new Member();
m.iNumVertices = 0;
于 2010-08-05T14:50:05.947 回答
4
learn what "static" actually means

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

这是代码示例:

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;

于 2010-08-05T15:24:08.807 回答
2

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

更多在这里:

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

于 2010-08-05T14:37:43.353 回答
1

静态变量不需要为了被实例化而被实例化,所以如果你试图从一个静态上下文中访问一个非静态变量,你就有可能试图访问一些没有被初始化/实例化的东西。

于 2010-08-05T14:39:30.503 回答
1

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

于 2010-08-05T14:48:20.473 回答
0

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

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

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

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

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

于 2010-08-05T14:41:03.607 回答
0

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

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

于 2010-08-05T14:41:59.147 回答