Constant is the concept, the property of the variable.
final is the java keyword to declare a constant variable.
As other people pointed out, from a semantic/linguistic point of view the expression constant variable is an oxymoron and, as such, we could argue about its correctness.
Quoting the specification, anyway, we can read
A variable of primitive type [...], that is final and initialized with a compile-time constant expression (§15.28), is called a constant variable.
I suppose, hence, that we can accept (and consider correct) this binomial for our purpose.
Answer from Luigi Cortese on Stack OverflowConstant is the concept, the property of the variable.
final is the java keyword to declare a constant variable.
As other people pointed out, from a semantic/linguistic point of view the expression constant variable is an oxymoron and, as such, we could argue about its correctness.
Quoting the specification, anyway, we can read
A variable of primitive type [...], that is final and initialized with a compile-time constant expression (§15.28), is called a constant variable.
I suppose, hence, that we can accept (and consider correct) this binomial for our purpose.
Constant is not a keyword in Java.
It is a concept to make any variable constant. For this we use final keyword in Java so that after initializing the variable with final keyword , no one can reassign the value of that variable.
Can a final variable be static in Java?
What are the best practices for using final and static in Java?
How do final and static affect inheritance in Java?
Videos
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?
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
thisorsuperkeywords 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
staticsince 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
finalclass cannot be subclassed. This is done for reasons of security and efficiency. Accordingly, many of the Java standard library classes arefinal, for examplejava.lang.Systemandjava.lang.String. All methods in afinalclass are implicitlyfinal.A
finalmethod 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
finalvariable 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 ablank finalvariable, but in this case:- A
blank finalinstance variable must be assigned at every constructor of its class. - A
blank finalstatic variable must be assigned in a static initializer in its class.
- A
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.
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.