|
Consider the following Circle class with a static variable
public class Circle { public double radius = 1; /** An instance variable */ public static int count; /** A "static" variable */ public Circle() { } /** Constructor 1 for a circle object */ public Circle(double newRadius) /** Constructor 2 for a circle object */ { radius = newRadius; } public double getArea() /** Return the area of this circle */ { return 3.14159 * radius * radius; } public void setRadius(double newRadius) /** Set new radius for this circle */ { radius = newRadius; } } |
Let's create 2 different Circle objects and examine the difference....
Examine the behavior when we update the instance variable radius:
public class myProg { public static void main(String[] args) { Circle circle1 = new Circle(2); Circle circle2 = new Circle(4); circle1.count = 99; System.out.println( circle1.radius ); System.out.println( circle1.count ); System.out.println( circle2.radius ); System.out.println( circle2.count ); System.out.println(); circle1.radius++; // Updates an instance variable System.out.println( circle1.radius ); // Changed System.out.println( circle1.count ); System.out.println( circle2.radius ); // Unchanged --> not shared System.out.println( circle2.count ); } } |
Reason: instance variables are not shared !
DEMO: demo/03-classes/21-static/Demo.java + Circle.java
Examine the behavior when we update the static variable count:
public class myProg { public static void main(String[] args) { Circle circle1 = new Circle(2); Circle circle2 = new Circle(4); circle1.count = 99; System.out.println( circle1.radius ); System.out.println( circle1.count ); System.out.println( circle2.radius ); System.out.println( circle2.count ); System.out.println(); circle1.count++; // Updates a static variable System.out.println( circle1.radius ); System.out.println( circle1.count ); // Changed System.out.println( circle2.radius ); System.out.println( circle2.count ); // Also changed --> shared! } } |
Reason: static variables are shared !
DEMO: demo/03-classes/21-static/Demo2.java + Circle.java
|
|
Let's write the code next...
(1) define a static variable count and initialize it to zero:
public class Circle { public double radius = 1; /** An instance variable */ public static int count = 0; /** A "static" variable */ public Circle() /** Constructor 1 for a circle object */ { } public Circle(double newRadius) /** Constructor 2 for a circle object */ { radius = newRadius; } public double getArea() /** Return the area of this circle */ { return 3.14159 * radius * radius; } public void setRadius(double newRadius) /** Set new radius for this circle */ { radius = newRadius; } } |
(2) increase the static variable count in every constructor:
public class Circle { public double radius = 1; /** An instance variable */ public static int count = 0; /** A "static" variable */ public Circle() /** Constructor 1 for a circle object */ { count++; } public Circle(double newRadius) /** Constructor 2 for a circle object */ { radius = newRadius; count++; } public double getArea() /** Return the area of this circle */ { return 3.14159 * radius * radius; } public void setRadius(double newRadius) /** Set new radius for this circle */ { radius = newRadius; } } |
Let's create 2 Circle objects and examine the count....
Demo program that shows we can keep track of the number of Circle objects created:
public class myProg { public static void main(String[] args) { Circle circle1 = new Circle(2); System.out.println( circle1.radius ); System.out.println( circle1.count ); System.out.println(); Circle circle2 = new Circle(4); System.out.println( circle2.radius ); System.out.println( circle2.count ); } } |
DEMO: demo/03-classes/22-static
Comment: I define count as public to make the demo program short - otherwise, I will need accessor methods inside Circle...
|
|
|
|
|
|
DEMO: demo/03-classes/23-static-block -- put a break inside the static block
|