Running Race - Explaining Static
The static keyword is a reserved word in Java like int, for, if, and else.
It can be placed before the type when declaring member variables:
static int var = 1; static Robot rob;and before the return type for method definitions:
static float calculateArea(float width, float height){ // code } public static void main(String[] args){ // code }
1. Static Variable Lifetime
A member variable without static DOES NOT exist before an object/instance of a class is made.A member variable with static DOES exist before an object/instance of a class is made.
Take the Athlete class for example:
public class Athlete { static String raceLocation = "New York"; static String raceStartTime = "9.00am"; String name; int speed; int bibNumber; Athlete (String name, int speed){ this.name = name; this.speed = speed; } static double calculateDuration(double startSec, double finishSec){ // code } void run(){ // code } }
The static member variables in the Athlete class can be a accessed and modified without an object/instance of Athlete.
This does not work for non-static member variables:
Athlete.raceLocation = "NYC"; // OK! Athlete.name = "Jim"; // ERROR! Athlete jim = new Athlete("Jim", 10); // Athlete object/instance jim jim.raceLocation = "Boston"; // OK! jim.name = "Jimmy" // OK!
2. Only 1 Static Variable for all Objects of a Class
There is only 1 static member variable for all objects of a class.There are unique variables for each object of a class. For example:
Athlete jim = new Athlete("Jim", 10); Athlete amy = new Athlete("Amy", 6); System.out.println(jim.name); // prints "Jim" System.out.println(amy.name); // prints "Amy" System.out.println(jim.raceStartTime); // prints "9.00am" System.out.println(amy.raceStartTime); // prints "9.00am"In this example changing raceStartTime for jim to "10.00am" also changes the raceStartTime for amy.
The raceStartTime variable is the same for both jim and amy.
3. Non-Static Member Variables and Methods can not be put inside Static Methods
static methods can also be called before an object of a class exists, while non-static methods can't:Athlete.calculateDuration(0.0, 14.7); // OK! Athlete.run(); // ERROR! Athlete jim = new Athlete("Jim", 10); jim.run(); // OK! jim.calculateDuration(0.0, 14.7); // OK!This is why non-static member variables and methods can't be placed inside of static methods.
Static methods can be called before an object is created when non-static member variables haven't been created yet!
static double calculateDuration(double startSec, double finishSec){ double durationSec = finishSec - startSec; System.out.println(name + " ran the race in " + durationSec + " seconds."); // ERROR! name is non-static return durationSec; }The this keyword refers to an object so it can't be put inside of a static method either:
public static void main(String[] args){ JFrame frame = new JFrame(); frame.addActionListener(this); // ERROR! }