The static keyword can be used in 4 scenarios

  • static variables
  • static methods
  • static blocks of code
  • static nested class

Let's look at static variables and static methods first.

Static variable

  • It is a variable which belongs to the class and not to object (instance).
  • Static variables are initialized only once, at the start of the execution. These variables will be initialized first, before the initialization of any instance variables.
  • A single copy to be shared by all instances of the class.
  • A static variable can be accessed directly by the class name and doesn’t need any object.
  • Syntax: Class.variable

Static method

  • It is a method which belongs to the class and not to the object (instance).
  • A static method can access only static data. It can not access non-static data (instance variables) unless it has/creates an instance of the class.
  • A static method can call only other static methods and can not call a non-static method from it unless it has/creates an instance of the class.
  • A static method can be accessed directly by the class name and doesn’t need any object.
  • Syntax: Class.methodName()
  • A static method cannot refer to this or super keywords in anyway.

Static class

Java also has "static nested classes". A static nested class is just one which doesn't implicitly have a reference to an instance of the outer class.

Static nested classes can have instance methods and static methods.

There's no such thing as a top-level static class in Java.

Side note:

main method is static since it must be be accessible for an application to run before any instantiation takes place.

final keyword is used in several different contexts to define an entity which cannot later be changed.

  • A final class cannot be subclassed. This is done for reasons of security and efficiency. Accordingly, many of the Java standard library classes are final, for example java.lang.System and java.lang.String. All methods in a final class are implicitly final.

  • A final method can't be overridden by subclasses. This is used to prevent unexpected behavior from a subclass altering a method that may be crucial to the function or consistency of the class.

  • A final variable can only be initialized once, either via an initializer or an assignment statement.
    It does not need to be initialized at the point of declaration, this is called a blank final variable, but in this case:

    • A blank final instance variable must be assigned at every constructor of its class.
    • A blank final static variable must be assigned in a static initializer in its class.

Note: If the variable is a reference, this means that the variable cannot be re-bound to reference another object. But the object that it references is still mutable, if it was originally mutable.

When an anonymous inner class is defined within the body of a method, all variables declared final in the scope of that method are accessible from within the inner class. Once it has been assigned, the value of the final variable cannot change.

Answer from Ashish on Stack Overflow
Top answer
1 of 11
279

The static keyword can be used in 4 scenarios

  • static variables
  • static methods
  • static blocks of code
  • static nested class

Let's look at static variables and static methods first.

Static variable

  • It is a variable which belongs to the class and not to object (instance).
  • Static variables are initialized only once, at the start of the execution. These variables will be initialized first, before the initialization of any instance variables.
  • A single copy to be shared by all instances of the class.
  • A static variable can be accessed directly by the class name and doesn’t need any object.
  • Syntax: Class.variable

Static method

  • It is a method which belongs to the class and not to the object (instance).
  • A static method can access only static data. It can not access non-static data (instance variables) unless it has/creates an instance of the class.
  • A static method can call only other static methods and can not call a non-static method from it unless it has/creates an instance of the class.
  • A static method can be accessed directly by the class name and doesn’t need any object.
  • Syntax: Class.methodName()
  • A static method cannot refer to this or super keywords in anyway.

Static class

Java also has "static nested classes". A static nested class is just one which doesn't implicitly have a reference to an instance of the outer class.

Static nested classes can have instance methods and static methods.

There's no such thing as a top-level static class in Java.

Side note:

main method is static since it must be be accessible for an application to run before any instantiation takes place.

final keyword is used in several different contexts to define an entity which cannot later be changed.

  • A final class cannot be subclassed. This is done for reasons of security and efficiency. Accordingly, many of the Java standard library classes are final, for example java.lang.System and java.lang.String. All methods in a final class are implicitly final.

  • A final method can't be overridden by subclasses. This is used to prevent unexpected behavior from a subclass altering a method that may be crucial to the function or consistency of the class.

  • A final variable can only be initialized once, either via an initializer or an assignment statement.
    It does not need to be initialized at the point of declaration, this is called a blank final variable, but in this case:

    • A blank final instance variable must be assigned at every constructor of its class.
    • A blank final static variable must be assigned in a static initializer in its class.

Note: If the variable is a reference, this means that the variable cannot be re-bound to reference another object. But the object that it references is still mutable, if it was originally mutable.

When an anonymous inner class is defined within the body of a method, all variables declared final in the scope of that method are accessible from within the inner class. Once it has been assigned, the value of the final variable cannot change.

2 of 11
45

static means it belongs to the class not an instance, this means that there is only one copy of that variable/method shared between all instances of a particular Class.

public class MyClass {
    public static int myVariable = 0; 
}

//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances

MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();

MyClass.myVariable = 5;  //This change is reflected in both instances

final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.

note A note on final methods and final classes, this is a way of explicitly stating that the method or class can not be overridden / extended respectively.

Extra Reading So on the topic of static, we were talking about the other uses it may have, it is sometimes used in static blocks. When using static variables it is sometimes necessary to set these variables up before using the class, but unfortunately you do not get a constructor. This is where the static keyword comes in.

public class MyClass {

    public static List<String> cars = new ArrayList<String>();

    static {
        cars.add("Ferrari");
        cars.add("Scoda");
    }

}

public class TestClass {

    public static void main(String args[]) {
        System.out.println(MyClass.cars.get(0));  //This will print Ferrari
    }
}

You must not get this confused with instance initializer blocks which are called before the constructor per instance.

🌐
Reddit
reddit.com › r/javahelp › difference between static, final and static final (variable pov)
r/javahelp on Reddit: Difference between static, final and static final (variable pov)
March 3, 2022 -

final - The value assigned to the variable cannot be changed.

static - Even in different class instances, compiler will allocate the same memory location to the variable which it had assigned no matter how many instances of that class. The value can be changed.

My question is: Why is the final keyword not allocating the same memory location to the variable, if the value cannot change?

Let us have different instances of a class and still we will have the same value in the variable as it has been declared as final.

Why do we need to write static final then, it could have been done via final only, am I missing on thinking some cases?

If someone can please clarify?

Top answer
1 of 5
11
Final can only be set once, but it still can be set and it can have a different value for each instance. Say you have a car class. Your make and model could be final and set in the constructor. Each new car can have a different make and model, but you can't change their make and model after it is set. Static variables are specific to the class and are cannot have seperate values for each instance. Your car class can have a car registry. To track all cars ever created, there is a static int that starts at 0 and is incremented by one each time a car is constructed. If this wasn't static, each car would have its own totalCars which would be one, since each instance starts at zero and that gets incremented in the constructor. However, since it is static, it is initialized with the class and each new car increases it by one so that it's value is equal to how many cars have been made. Static final is for constants. You need to know how fast your cars accelerate due to gravity. This value is set to 9.8. It is static because it doesn't matter which instance, it belongs to the class as a whole and you don't allow the value to be changed, so it can be final.
2 of 5
5
You have two completely separate concepts here: final - the value cannot be changed, once it has been assigned. (Unstated assumption here is that the value can be assigned after creation, and that it can be declared on a per-instance basis.) static - all instances share a common value. Nothing less, nothing more. What that means is that if one instance changes the value, it changes for all instances. Why do we need to write static final then, You don't need to write that, unless you want a specific behavior. Namely, that the variable can only be set once, and that it will be shared by all instances. Typically, you would declare the value with the variable, but I don't think you have to do that. It would be possible for you to create multiple instances, and then have one of them set the value for all of them, permanently.
People also ask

Can a final variable be static in Java?
Yes, a variable can be both final and static in Java. This combination is used to define constants that are common to all instances of a class. For example, public static final int MAX_SIZE = 100; declares a constant MAX_SIZE that is shared across all instances of the class and cannot be changed.
🌐
shiksha.com
shiksha.com › home › it & software › it & software articles › programming articles › difference between final and static in java
Difference Between Final and Static in Java
What are the best practices for using final and static in Java?
Best practices for using final: Use final for variables that should not change after initialization. Apply final to methods that should not be overridden to maintain the intended behavior across subclasses. Use final on classes that are not meant to be extended, often for reasons of security, simplicity, or design. Best practices for using static: Use static variables for class-level constants or fields shared by all instances. Apply static to methods that do not require access to instance-specific data. Utilize static blocks for initializing static variables or executing static initialization
🌐
shiksha.com
shiksha.com › home › it & software › it & software articles › programming articles › difference between final and static in java
Difference Between Final and Static in Java
How do final and static affect inheritance in Java?
Final and static keywords affect inheritance differently. A final class cannot be extended, meaning no subclass can inherit from a final class. A final method cannot be overridden by subclasses, which means the functionality defined by the final method is the same for all subclasses. On the other hand, static members (methods or variables) are not inherited in the same way instance members are; instead, they belong to the class level. While static methods can be hidden by subclasses (if they declare a static method with the same signature), this is not the same as overriding and does not follo
🌐
shiksha.com
shiksha.com › home › it & software › it & software articles › programming articles › difference between final and static in java
Difference Between Final and Static in Java
🌐
Baeldung
baeldung.com › home › java › core java › difference between “final static” and “static final”
Difference Between “final static” and “static final” | Baeldung
January 5, 2024 - This is useful for preventing accidental changes to important variables. The static keyword indicates that a variable belongs to the class itself rather than to any particular instance of the class.
🌐
Shiksha
shiksha.com › home › it & software › it & software articles › programming articles › difference between final and static in java
Difference Between Final and Static in Java
March 28, 2024 - In essence, final is used to declare entities that cannot be modified after they are set. ... The static keyword in Java is used to indicate that a particular field, method, or block belongs to the class, rather than instances of the class.
🌐
GeeksforGeeks
geeksforgeeks.org › java › java-final-vs-static-access-modifier
Java - Final vs Static Access Modifier - GeeksforGeeks
July 23, 2025 - First, final is a non-access modifier applicable only to a variable, a method, or a class. The following are different contexts where the final is used. The static keyword in Java is mainly used for memory management.
🌐
BYJUS
byjus.com › gate › difference-between-static-and-final-variable-in-java
Difference between Static and Final Variable in Java
March 31, 2023 - These variables help in saving a lot of memory and getting the memory at the time of loading the class. When a variable is expressed with the final keyword, then it is not possible to change its value.
Find elsewhere
🌐
TutorialsPoint
tutorialspoint.com › difference-between-static-and-final-in-java
Difference Between Static and Final in Java
The static method in Java is a method that belongs to the class rather than instances and can be called without creating an object.
🌐
Medium
medium.com › @chuck.m.park › final-vs-static-final-in-java-cf73e6cc6848
final vs static final in java. For final, it can be assigned different… | by Chuck Park | Medium
August 19, 2017 - Class Test{ public final int a; }Test t1 = new Test(); t1.a = 10; Test t2 = new Test(); t2.a = 20; //fixed · Thus each instance has different value of field a. For static final, all instances share the same value, and can’t be altered after first initialized.
🌐
Coderanch
coderanch.com › t › 404575 › java › static-final-final-static
static final (or) final static (Beginning Java forum at Coderanch)
I have the second edition handy and in section 8.3.1 (Field Modifers) they give the production: FieldModifier: one of public protected private static final transient volatile Below this it is written: If two or more (distinct) field modifiers appear in a field declaration, it is customary, though not required, that they appear in the order consistent with that shown above in the production for FieldModifier. That is where I got the idea that "static final" or "public static final" was prefered. ... but you can definately write i beleive as static public final void in ABC=100; [ August 28, 2006: Message edited by: Guru Yegnanarayanan ]
🌐
TheServerSide
theserverside.com › video › Why-we-use-static-final-in-Java-for-constants
Why we use static final in Java for constants | TheServerSide
The reason why global constants in Java use the static and final keywords is because final ensures a variable cannot change, while static ensures only one copy of the constant variable is placed in memory, regardless of how many class instances are created.
🌐
Testbook
testbook.com › home › key differences › difference between static and final variable in java - testbook.com
Difference between Static and Final Variable in Java - Testbook.com
Conversely, the final keyword is used to declare a constant variable and to prevent the user from modifying a method, variable, or class. Let's delve into the major differences between static and final keywords in Java.
🌐
Tech Differences
techdifferences.com › home › difference between static and final in java
Difference Between Static and Final in Java (with Comparison Chart) - Tech Differences
December 25, 2019 - The main difference between a static and final keyword is that static is keyword is used to let the class member be accessed without the reference of the object of the class. Final keyword is used to declare, a constant variable, a method which ...
🌐
Blogger
javarevisited.blogspot.com › 2017 › 01 › how-public-static-final-variable-works.html
How public static final variable works in Java? Example
In short, No, they are not the same. Even though both are final variables and you cannot change their value once assigned there is a very subtle difference between them. A public static final variable is a compile-time constant, but a public final is just a final variable, i.e.
🌐
Quora
quora.com › What-is-the-difference-between-final-and-static-in-Java
What is the difference between final and static in Java? - Quora
Answer (1 of 2): final keyword implies something, which cannot be changed. For example - final variables cannot be reassigned, final fields in a class cannot be set once they’re defined, final methods cannot be overridden, and, final classes cannot be extended/subclassed. final in Java is more an...
🌐
DataCamp
datacamp.com › doc › java › static-and-final-keyword
Static and Final Keyword
Static Initialization: Use static blocks for complex static initialization tasks that cannot be handled by a simple assignment. ... Memory Considerations: Be cautious with static variables in memory-sensitive applications, as they persist for the lifetime of the application.
Top answer
1 of 7
124

You are making a huge mix of many different concepts. Even the question in the title does not correspond to the question in the body.

Anyways, these are the concepts you are mixing up:

  • variables
  • final variables
  • fields
  • final fields
  • static fields
  • final static fields

The keyword static makes sense only for fields, but in the code you show you are trying to use it inside a function, where you cannot declare fields (fields are members of classes; variables are declared in methods).

Let's try to rapidly describe them.

  1. variables are declared in methods, and used as some kind of mutable local storage (int x; x = 5; x++)

  2. final variables are also declared in methods, and are used as an immutable local storage (final int y; y = 0; y++; // won't compile). They are useful to catch bugs where someone would try to modify something that should not be modified. I personally make most of my local variables and methods parameters final. Also, they are necessary when you reference them from inner, anonymous classes. In some programming languages, the only kind of variable is an immutable variable (in other languages, the "default" kind of variable is the immutable variable) -- as an exercise, try to figure out how to write a loop that would run an specified number of times when you are not allowed to change anything after initialization! (try, for example, to solve fizzbuzz with only final variables!).

  3. fields define the mutable state of objects, and are declared in classes (class x { int myField; }).

  4. final fields define the immutable state of objects, are declared in classes and must be initialized before the constructor finishes (class x { final int myField = 5; }). They cannot be modified. They are very useful when doing multithreading, since they have special properties related to sharing objects among threads (you are guaranteed that every thread will see the correctly initialized value of an object's final fields, if the object is shared after the constructor has finished, and even if it is shared with data races). If you want another exercise, try to solve fizzbuzz again using only final fields, and no other fields, not any variables nor method parameters (obviously, you are allowed to declare parameters in constructors, but thats all!).

  5. static fields are shared among all instances of any class. You can think of them as some kind of global mutable storage (class x { static int globalField = 5; }). The most trivial (and usually useless) example would be to count instances of an object (ie, class x { static int count = 0; x() { count++; } }, here the constructor increments the count each time it is called, ie, each time you create an instance of x with new x()). Beware that, unlike final fields, they are not inherently thread-safe; in other words, you will most certainly get a wrong count of instances of x with the code above if you are instantiating from different threads; to make it correct, you'd have to add some synchronization mechanism or use some specialized class for this purpose, but that is another question (actually, it might be the subject of a whole book).

  6. final static fields are global constants (class MyConstants { public static final double PI = 3.1415926535897932384626433; }).

There are many other subtle characteristics (like: compilers are free to replace references to a final static field to their values directly, which makes reflection useless on such fields; final fields might actually be modified with reflection, but this is very error prone; and so on), but I'd say you have a long way to go before digging in further.

Finally, there are also other keywords that might be used with fields, like transient, volatile and the access levels (public, protected, private). But that is another question (actually, in case you want to ask about them, many other questions, I'd say).

2 of 7
29

Static members are those which can be accessed without creating an object. This means that those are class members and nothing to do with any instances. and hence can not be defined in the method.

Final in other terms, is a constant (as in C). You can have final variable inside the method as well as at class level. If you put final as static it becomes "a class member which is constant".

🌐
Difference Between
differencebetween.com › difference-between-static-and-vs-final-in-java
Difference Between static and final in Java | Compare the Difference Between Similar Terms
March 9, 2018 - The difference between static and final in Java is that static is used to define the class member that can be used independently of any object of the class while final is used to declare a constant variable or a method that cannot be overridden or a class that cannot be inherited...
🌐
Reddit
reddit.com › r/learnprogramming › final, static, and static final in java
r/learnprogramming on Reddit: Final, static, and static final in Java
September 28, 2021 -

Please correct me if I am wrong, and explain where my understanding is incomplete.

From what I've read both static and final are keywords. If you make a variable or method static, it would only be accessed by the class itself and not by an instance of the class (object). A static class would be useful if it was nested inside another class and you didn't want an instance of the outer class to access the inner class.

If you make a variable final, then it is initialized once and not changed. A final class can't be subclassed, and a final method can't be overwritten. If a variable is static final, then it cannot be changed and it can only be accessed by the class itself and not an object of the class.

People use static all the time, but why is it useful to limit the access of a method or variable to the class itself and not any instances of it?

Top answer
1 of 16
332

In general, static means "associated with the type itself, rather than an instance of the type."

That means you can reference a static variable without having ever created an instances of the type, and any code referring to the variable is referring to the exact same data. Compare this with an instance variable: in that case, there's one independent version of the variable per instance of the class. So for example:

Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);

prints out 10: y.instanceVariable and x.instanceVariable are separate, because x and y refer to different objects.

You can refer to static members via references, although it's a bad idea to do so. If we did:

Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);

then that would print out 20 - there's only one variable, not one per instance. It would have been clearer to write this as:

Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);

That makes the behaviour much more obvious. Modern IDEs will usually suggest changing the second listing into the third.

There is no reason to have an inline declaration initializing the value like the following, as each instance will have its own NUMBER but always with the same value (is immutable and initialized with a literal). This is the same than to have only one final static variable for all instances.

private final int NUMBER = 10;

Therefore if it cannot change, there is no point having one copy per instance.

But, it makes sense if is initialized in a constructor like this:

// No initialization when is declared
private final int number;

public MyClass(int n) {
   // The variable can be assigned in the constructor, but then
   // not modified later.
   number = n;
}

Now, for each instance of MyClass, we can have a different but immutable value of number.

2 of 16
47

A static variable stays in the memory for the entire lifetime of the application, and is initialised during class loading. A non-static variable is being initialised each time you construct a new object. It's generally better to use:

private static final int NUMBER = 10;

Why? This reduces the memory footprint per instance. It possibly is also favourable for cache hits. And it just makes sense: static should be used for things that are shared across all instances (a.k.a. objects) of a certain type (a.k.a. class).