代码之家  ›  专栏  ›  技术社区  ›  Hristo

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

  •  7
  • Hristo  · 技术社区  · 15 年前

    我已经碰到这个问题很多次了,我从来没有费心去了解它为什么会发生,也没有去了解“静态”实际上意味着什么。我刚刚应用了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 回复  |  直到 12 年前
        1
  •  9
  •   Jonathon Faust    15 年前

    下面是您的示例:

    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 ,因此它无法访问与 成员 . 解决方法是 使这些字段保持静态。相反,您需要创建 成员 使用 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
        }
    }
    

    发现自己正在创建全局静态是您应该仔细考虑如何设计的一个指示。它不是 总是 错了,但它应该告诉你去想你在做什么。

        2
  •  4
  •   Ara    15 年前

    静止的 变量是在类的所有对象之间共享的变量。在您的示例中,对于 成员 你创建,你会得到拥有它自己的对象 英珠 价值观。当你使用 静止的 对于变量,每个对象之间只有一个共享的变量 成员 . 静止的 方法的工作方式相同-它们在所有对象之间共享。

    自从 静止的 变量/方法对所有对象都是通用的,不需要创建类的对象来访问这些变量/方法。

    非静态变量 英珠 属于类的对象。如果不创建对象,则无法访问它们。因此,当您从静态上下文访问非静态变量时(此处 主要的 方法,那么Java就不知道哪个对象是 英珠 您正在尝试访问。因此出现了错误。

    要么制造 英珠 静态的,或通过创建成员的对象来引用它

    Member m = new Member();
    m.iNumVertices = 0;
    
        3
  •  4
  •   Chadwick    15 年前
    learn what "static" actually means
    

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

    下面是代码示例:

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

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

    Car car = new Car(100);
    

    每次创建汽车实例时,它的速度都是100,因此避免了静态声明。 private static int speed = 100;

        4
  •  2
  •   FrustratedWithFormsDesigner    15 年前

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

    这里更多:

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

        5
  •  1
  •   dave    15 年前

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

        6
  •  1
  •   user281693    15 年前

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

        7
  •  0
  •   KristofMols    15 年前

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

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

        8
  •  0
  •   YoK    15 年前

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

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

    这些变量也可以称为类级变量。 通常,您将常量(定义常量时还需要最后一个关键字)和全局变量定义为静态变量。

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

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