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