I've been running into this problem many times and I never bothered to learn why its happening and learn what "static" actually means. I just applied the change that Eclipse suggested and moved on.
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
}
So eclipse tells me to do static int iNumVertices;
and I'm not sure why. So what exactly is "static", how is it used, what is the purpose of using "static", and why is it giving me this problem?
Here's your example:
The method
main
is a static method associated with the class. It is not associated with an instance ofMember
, so it cannot access variables that are associated with an instance ofMember
. The solution to this is not to make those fields static. Instead, you need to create an instance ofMember
using thenew
keyword.Here's a modified version:
Finding yourself creating global statics is an indication to you that you should think carefully about how you're designing something. It's not always wrong, but it should tell you to think about what you're doing.
Static variables are class variables. There will be a single copy of that variable avaiable to all instances of the class and they will share that variable. Static members can also be used without referencing a specific instance of the class.
More here:
http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html
static variables are common to all instances of a Class.
Note: As said earlier these are class variables i.e. shared by all instances.
These can also be called as class level variables. Generally you define Constants(You will also need final keyword for defining constants) and Global variables as static.
For more information refer: http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html
http://www.roseindia.net/java/beginners/staticvariable.shtml
Static methods can access only static variables. There are two kinds of variables in class. one is static variables(also class variables) and other is instance variable. Only one copy of Static variable exists in memory but instance variables will be instantiated for each object. So for static variables all objects access the same variable and any change made by one object will be reflected to other objects. The question here is why is that methods have to be static to access static variables. When you make a method static, you can access the method without instantiating objects of that class. So if this method is able to access instance variables then for which object's variables should it make change to? The other way is possible ie non static methods can access static variables.
static variables are those that are shared across all objects of a class. Here in your example for every object of Member you create , you will get objects that have it's own iNumVertices values. When you use static with a variable, there is only one variable shared across every object of Member. static methods work the same way - they are shared across all objects.
Since static variables/methods are common to all objects, one need not make an object of the class to access these variables/methods.
Non-static variables like iNumVertices belong to an object of a class. They cannot be accessed without creating an object. So when you access a non-static variable from a static context (here main method), then java wouldn't know which object's iNumVertices you are trying to accesss. Hence the error.
Either make iNumVertices static, or refer to it by creating an object of Member
Every class variable (a variable declared within the class body and outside the method bodies) used in a static method needs to be declared static too.
Static class variables and methods can be accessed outside that class without the need for an instance of that class.