Static variables and methods are not part of an instance, There will always be a single copy of that variable no matter how many objects you create of a particular class.
For example you might want to have an immutable list of constants, it would be a good idea to keep it static and initialize it just once inside a static method. This would give you a significant performance gain if you are creating several instances of a particular class on a regular basis.
Furthermore you can also have a static block in a class as well. You can use it to assign a default value to a static variable. They are executed only once when the class is loaded into memory.
Instance variable as the name suggest are dependent on an instance of a particular object, they live to serve the whims of it. You can play around with them during a particular life cycle of an object.
All the fields and methods of a class used inside a static method of that class must be static or local. If you try to use instance (non-static) variables or methods, your code will not compile.
public class Week {
static int daysOfTheWeek = 7; // static variable
int dayOfTheWeek; // instance variable
public static int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this will cause errors
}
public int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this is valid
}
public static int getDaysLeftInTheWeek(int today){
return Week.daysOfTheWeek-today; // this is valid
}
}