By Click Upvote


2009-01-05 17:41:38 8 Comments

To be specific, I was trying this code:

package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

But it gave the error

Cannot access non-static field in static method main

So I changed the declaration of clock to this:

static Clock clock = new Clock();

And it worked. What does it mean to put that keyword before the declaration? What exactly will it do and/or restrict in terms of what can be done to that object?

21 comments

@Mehrdad Afshari 2009-01-05 17:44:31

static members belong to the class instead of a specific instance.

It means that only one instance of a static field exists[1] even if you create a million instances of the class or you don't create any. It will be shared by all instances.

Since static methods also do not belong to a specific instance, they can't refer to instance members. In the example given, main does not know which instance of the Hello class (and therefore which instance of the Clock class) it should refer to. static members can only refer to static members. Instance members can, of course access static members.

Side note: Of course, static members can access instance members through an object reference.

Example:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;

        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[1]: Depending on the runtime characteristics, it can be one per ClassLoader or AppDomain or thread, but that is beside the point.

@TheSoftwareJedi 2009-01-05 18:44:26

In .NET, you can also modify this behavior using the [ThreadStatic] attribute - which makes the static local to particular threads.

@user3526905 2016-10-22 14:49:03

I know this is old post but for beginners like me this may be helpful.stackoverflow.com/questions/7026507/…

@Matt Corby 2017-11-05 16:07:48

Wouldn't you be unable to access instance.instanceField since it's a private var? Or is it valid because you instantiated the object inside it's own class? Sounds like a recursive nightmare to me but i'm a Java newbie.

@Dan 2019-03-05 17:35:18

If the static member of a class is referenced by 2 different threads then how many instances are there of that static member? I feel like it's 2 but if you want the same instance across threads then the volatile keyword has to be used. Is that correct?

@mckenzm 2019-08-05 04:30:57

..and is the value preserved if there are no instances of the class remaining ?

@Mohammad Parvez 2018-09-18 12:59:33

//Here is an example 

public class StaticClass 
{
    static int version;
    public void printVersion() {
         System.out.println(version);
    }
}

public class MainClass 
{
    public static void main(String args[]) {  
        StaticClass staticVar1 = new StaticClass();
        staticVar1.version = 10;
        staticVar1.printVersion() // Output 10

        StaticClass staticVar2 = new StaticClass();
        staticVar2.printVersion() // Output 10
        staticVar2.version = 20;
        staticVar2.printVersion() // Output 20
        staticVar1.printVersion() // Output 20
    }
}

@Bharthan 2015-05-13 13:36:36

main() is a static method which has two fundamental restrictions:

  1. The static method cannot use a non-static data member or directly call non-static method.
  2. this() and super() cannot be used in static context.

    class A {  
        int a = 40; //non static
        public static void main(String args[]) {  
            System.out.println(a);  
        }  
    }
    

Output: Compile Time Error

@Elie 2009-01-05 17:45:52

Static means that you don't have to create an instance of the class to use the methods or variables associated with the class. In your example, you could call:

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

directly, instead of:

Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

From inside a static method (which belongs to a class) you cannot access any members which are not static, since their values depend on your instantiation of the class. A non-static Clock object, which is an instance member, would have a different value/reference for each instance of your Hello class, and therefore you could not access it from the static portion of the class.

@Andrejs 2016-07-18 07:32:54

To add to existing answers, let me try with a picture:

An interest rate of 2% is applied to ALL savings accounts. Hence it is static.

A balance should be individual, so it is not static.

enter image description here

@Dev4World 2017-10-26 06:35:17

When run some project firstly load static things(variables, methods, blocks..).

When run this project main method load first. Because its static method. Then it look object "a" object .But object a not define yet. Because its non static. Then come like this error.

@Uddhav Gautam 2017-04-04 05:48:02

Understanding Static concepts

public class StaticPractise1 {
    public static void main(String[] args) {
        StaticPractise2 staticPractise2 = new StaticPractise2();
        staticPractise2.printUddhav(); //true
        StaticPractise2.printUddhav(); /* false, because printUddhav() is although inside StaticPractise2, but it is where exactly depends on PC program counter on runtime. */

        StaticPractise2.printUddhavsStatic1(); //true
        staticPractise2.printUddhavsStatic1(); /*false, because, when staticPractise2 is blueprinted, it tracks everything other than static  things and it organizes in its own heap. So, class static methods, object can't reference */

    }
}

Second Class

public class StaticPractise2 {
    public static void printUddhavsStatic1() {
        System.out.println("Uddhav");
    }

    public void printUddhav() {
        System.out.println("Uddhav");
    }
}

@Paul Tomblin 2009-01-05 17:45:56

It means that there is only one instance of "clock" in Hello, not one per each separate instance of the "Hello" class, or more-so, it means that there will be one commonly shared "clock" reference among all instances of the "Hello" class.

So if you were to do a "new Hello" anywhere in your code: A- in the first scenario (before the change, without using "static"), it would make a new clock every time a "new Hello" is called, but B- in the second scenario (after the change, using "static"), every "new Hello" instance would still share and use the initial and same "clock" reference first created.

Unless you needed "clock" somewhere outside of main, this would work just as well:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}

@Jason S 2009-01-05 17:53:26

This is the more usual way of doing it. The main() routine should be self-contained.

@Click Upvote 2009-01-05 18:03:13

In the second instance it would create a new instance of Clock each time the main method is called, right?

@Paul Tomblin 2009-01-05 18:30:12

In the second instance, clock static, it would only create it once. In my example, where clock is within the main, then yes, it would create it new every time main is called. But normally main is only called once on program start, and when it exits, everything is free-ed.

@user5621266 2017-09-03 04:44:23

I can't get how is it possible to make a new clock in the main method? as you say it would create it new every time main is called, but there is only one main method. how that main method can refer to different clock instances? It's a little difficult to understand how is it possible to make new instance of clock in the main and use it's method sayTime(), but it is not possible to make the instance out of the main and use sayTime(). how is everything free when main is called once? @PaulTomblin

@Paul Tomblin 2017-09-03 22:15:11

@user5621266 I only used the main method because the OP did. If instead it was a public method that was called from elsewhere, and the Hello class was instantiated more than once, then it could create a Clock instance for each Hello instance, unless clock was static.

@Bala Krishna 2015-06-24 16:47:22

Static Variables Can only be accessed only in static methods, so when we declare the static variables those getter and setter methods will be static methods

static methods is a class level we can access using class name

The following is example for Static Variables Getters And Setters:

public class Static 
{

    private static String owner;
    private static int rent;
    private String car;
    public String getCar() {
        return car;
    }
    public void setCar(String car) {
        this.car = car;
    }
    public static int getRent() {
        return rent;
    }
    public static void setRent(int rent) {
        Static.rent = rent;
    }
    public static String getOwner() {
        return owner;
    }

    public static void setOwner(String owner) {
        Static.owner = owner;
    }

}

@Virtual 2016-08-14 13:03:23

Static in Java:

Static is a Non Access Modifier. The static keyword belongs to the class than instance of the class. can be used to attach a Variable or Method to a Class.

Static keyword CAN be used with:

Method

Variable

Class nested within another Class

Initialization Block

CAN'T be used with:

Class (Not Nested)

Constructor

Interfaces

Method Local Inner Class(Difference then nested class)

Inner Class methods

Instance Variables

Local Variables

Example:

Imagine the following example which has an instance variable named count which in incremented in the constructor:

package pkg;

class StaticExample {
    int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

Output:

1 1 1

Since instance variable gets the memory at the time of object creation, each object will have the copy of the instance variable, if it is incremented, it won't reflect to other objects.

Now if we change the instance variable count to a static one then the program will produce different output:

package pkg;

class StaticExample {
    static int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

Output:

1 2 3

In this case static variable will get the memory only once, if any object changes the value of the static variable, it will retain its value.

Static with Final:

The global variable which is declared as final and static remains unchanged for the whole execution. Because, Static members are stored in the class memory and they are loaded only once in the whole execution. They are common to all objects of the class. If you declare static variables as final, any of the objects can’t change their value as it is final. Therefore, variables declared as final and static are sometimes referred to as Constants. All fields of interfaces are referred as constants, because they are final and static by default.

enter image description here

Picture Resource : Final Static

@Vasil Valchev 2014-03-13 18:26:41

Basic usage of static members...

public class Hello
{
    // value / method
    public static String staticValue;
    public String nonStaticValue;
}

class A
{
    Hello hello = new Hello();
    hello.staticValue = "abc";
    hello.nonStaticValue = "xyz";
}

class B
{
    Hello hello2 = new Hello(); // here staticValue = "abc"
    hello2.staticValue; // will have value of "abc"
    hello2.nonStaticValue; // will have value of null
}

That's how you can have values shared in all class members without sending class instance Hello to other class. And whit static you don't need to create class instance.

Hello hello = new Hello();
hello.staticValue = "abc";

You can just call static values or methods by class name:

Hello.staticValue = "abc";

@scottb 2015-10-03 16:15:32

In Java, the static keyword can be simply regarded as indicating the following:

"without regard or relationship to any particular instance"

If you think of static in this way, it becomes easier to understand its use in the various contexts in which it is encountered:

  • A static field is a field that belongs to the class rather than to any particular instance

  • A static method is a method that has no notion of this; it is defined on the class and doesn't know about any particular instance of that class unless a reference is passed to it

  • A static member class is a nested class without any notion or knowledge of an instance of its enclosing class (unless a reference to an enclosing class instance is passed to it)

@Jon Skeet 2009-07-04 06:35:47

The static keyword means that something (a field, method or nested class) is related to the type rather than any particular instance of the type. So for example, one calls Math.sin(...) without any instance of the Math class, and indeed you can't create an instance of the Math class.

For more information, see the relevant bit of Oracle's Java Tutorial.


Sidenote

Java unfortunately allows you to access static members as if they were instance members, e.g.

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

That makes it look as if sleep is an instance method, but it's actually a static method - it always makes the current thread sleep. It's better practice to make this clear in the calling code:

// Clearer
Thread.sleep(5000);

@Jiahui Zhang 2018-04-16 15:28:29

Another example: System.out.println() looks like a class method, but it's actually a instance method. Since out is a PrintStream instance in System class.

@Jon Skeet 2018-04-16 17:04:00

@LeslieCheung: No, it doesn't look like a class method to me, as System.out doesn't like a type name to me.

@hfontanez 2014-11-12 19:50:25

The keyword static is used to denote a field or a method as belonging to the class itself and not the instance. Using your code, if the object Clock is static, all of the instances of the Hello class will share this Clock data member (field) in common. If you make it non-static, each individual instance of Hello can have a unique Clock field.

The problem is that you added a main method to your class Hello so that you could run the code. The problem here is that the main method is static and as such, it cannot refer to non-static fields or methods inside of it. You can resolve this in two ways:

  1. Make all fields and methods of the Hello class static so that they could be referred to inside the main method. This is really not a good thing to do (or the wrong reason t make a field and/or a method static)
  2. Create an instance of your Hello class inside the main method and access all it's fields and methods the way they were intended to in the first place.

For you, this means the following change to your code:

package hello;

public class Hello {

    private Clock clock = new Clock();

    public Clock getClock() {
        return clock;
    }

    public static void main(String args[]) {
        Hello hello = new Hello();
        hello.getClock().sayTime();
    }
}

@javaguy 2012-12-17 20:34:04

I have developed a liking for static methods (only, if possible) in "helper" classes.

The calling class need not create another member (instance) variable of the helper class. You just call the methods of the helper class. Also the helper class is improved because you no longer need a constructor, and you need no member (instance) variables.

There are probably other advantages.

@geowa4 2009-07-04 06:26:07

The static keyword in Java means that the variable or function is shared between all instances of that class as it belongs to the type, not the actual objects themselves.

So if you have a variable: private static int i = 0; and you increment it (i++) in one instance, the change will be reflected in all instances. i will now be 1 in all instances.

Static methods can be used without instantiating an object.

@Jon Skeet 2009-07-04 06:33:04

"Shared between all instances" gives the wrong impression, IMO - it suggests that you do need to have an instance of the object.

@Jon Skeet 2009-07-04 06:33:51

(Whereas really there don't need to be any instances, because the static field etc belongs to the type.)

@truongnm 2016-04-17 09:42:02

@Jon Skeet static belongs to type, not object? Can you tell more detail? Type like datatype: int, double, ... ?

@Jon Skeet 2016-04-17 10:35:27

@truongnm: Type as in the class that declares the variable/method.

@kal 2009-01-05 19:36:22

Can also think of static members not having a "this" pointer. They are shared among all instances.

@Julien Chastang 2009-01-05 18:14:03

This discussion has so far ignored classloader considerations. Strictly speaking, Java static fields are shared between all instances of a class for a given classloader.

@Zach Langley 2009-01-05 19:43:45

This was mentioned by Apocalisp in the comments on Merhdad's answer.

@sleske 2009-10-02 14:47:05

Good point. Many people don't know this, but once you start messing with classloaders, it becomes very important.

@user207421 2015-04-19 09:42:58

This is all true but it doesn't answer the question. It should have been posted as a comment.

@sblundy 2009-01-05 17:48:41

A field can be assigned to either the class or an instance of a class. By default fields are instance variables. By using static the field becomes a class variable, thus there is one and only one clock. If you make a changes in one place, it's visible everywhere. Instance varables are changed independently of one another.

@Marc Novakowski 2009-01-05 17:45:58

static methods don't use any instance variables of the class they are defined in. A very good explanation of the difference can be found on this page

@John 2015-11-16 03:07:04

The link no longer works.

@Stephen Doyle 2009-01-05 17:45:58

Static makes the clock member a class member instead of an instance member. Without the static keyword you would need to create an instance of the Hello class (which has a clock member variable) - e.g.

Hello hello = new Hello();
hello.clock.sayTime();

Related Questions

Sponsored Content

34 Answered Questions

[SOLVED] Reference - What does this error mean in PHP?

18 Answered Questions

[SOLVED] What does "static" mean in C?

  • 2009-02-21 06:47:52
  • David
  • 847676 View
  • 1045 Score
  • 18 Answer
  • Tags:   c syntax static

24 Answered Questions

[SOLVED] What is a serialVersionUID and why should I use it?

23 Answered Questions

[SOLVED] What is the difference between @staticmethod and @classmethod?

34 Answered Questions

[SOLVED] What is the difference between an interface and abstract class?

36 Answered Questions

[SOLVED] What is Inversion of Control?

16 Answered Questions

[SOLVED] What are metaclasses in Python?

17 Answered Questions

[SOLVED] Are static class variables possible in Python?

25 Answered Questions

[SOLVED] Java inner class and static nested class

36 Answered Questions

[SOLVED] Difference between static class and singleton pattern?

Sponsored Content