# Running Race - Explaining Static

View Source View Source

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!
}