1.124 Lecture 11 - Supplement 10/17/2000

Shape Example

Point.java

public class Point
{
    private float mfX, mfY;

    public Point() {
        mfX = mfY = 0.0f;
    }

    public Point(float fX, float fY) {
        mfX = fX;
        mfY = fY;
    }

    public Point(Point p) {
        mfX = p.mfX;
        mfY = p.mfY;
    }

    // You will generally not need to write a finalizer.  Member variables that
    // are of reference type will be automatically garbage collected once they
    // are no longer in use.  Finalizers are only for cleaning up system resources,
    // e.g. closing files.
    protected void finalize() throws Throwable {
        System.out.print("In Point finalizer: ");
        print();
        super.finalize();  // If you have to write a finalizer, be sure to do this.
    }

    public void print() {
        System.out.println("Point print: (" + mfX + "," + mfY + ")");
    }
}
 

Shape.java

public abstract class Shape
{
    private Point mCenter;
    protected static int miCount = 0;  // An example of a static member variable.

    public Shape() {
        mCenter = new Point();
    }

    public Shape(Point p) {
        mCenter = new Point(p);
    }

    // You will generally not need to write a finalizer.  Member variables that
    // are of reference type (i.e. mCenter) will be automatically garbage collected
    // once they are no longer in use.  Finalizers are only for cleaning up system
    // resources, e.g. closing files.
    protected void finalize() throws Throwable {
        System.out.print("In Shape finalizer: ");
        print();
        super.finalize();  // If you have to write a finalizer, be sure to do this.
    }

    public void print() {
        System.out.print("Shape print: mCenter = ");
        mCenter.print();
    }

    // An example of a static member function.
    public static int getCount() {
        return miCount;  // Can only access static members in static functions.
    }
}
 

Circle.java

public class Circle extends Shape
{
    private float mfRadius;

    public Circle() {
        super();  // Call the base class constructer.
        mfRadius = 0.0f;
        miCount++;  // Can access this because it is protected in base class.
    }

    public Circle(float fX, float fY, float fRadius) {
        super(new Point(fX, fY));  // Call the base class constructer.
        mfRadius = fRadius;
        miCount++;
    }

    public Circle(Point p, float fRadius) {
        super(p);  // Call the base class constructer.
        mfRadius = fRadius;
        miCount++;
    }

    // You will generally not need to write a finalizer.  Member variables that
    // are of reference type (i.e. mCenter) will be automatically garbage collected
    // once they are no longer in use.  Finalizers are only for cleaning up system
    // resources, e.g. closing files.
    protected void finalize() throws Throwable {
        System.out.print("In Circle finalizer: ");
        print();
        super.finalize();  // If you have to write a finalizer, be sure to do this.
    }

    public void print() {
        System.out.print("Circle print: mfRadius = " + mfRadius + " ");
        super.print();
    }
}
 

Square.java

public class Square extends Shape
{
    private float mfLength;

    public Square() {
        super();  // Call the base class constructer.
        mfLength = 0.0f;
        miCount++;  // Can access this because it is protected in base class.
    }

    public Square(float fX, float fY, float fLength) {
        super(new Point(fX, fY));  // Call the base class constructer.
        mfLength = fLength;
        miCount++;
    }

    public Square(Point p, float fLength) {
        super(p);  // Call the base class constructer.
        mfLength = fLength;
        miCount++;
    }

    // You will generally not need to write a finalizer.  Member variables that
    // are of reference type (i.e. mCenter) will be automatically garbage collected
    // once they are no longer in use.  Finalizers are only for cleaning up system
    // resources, e.g. closing files.
    protected void finalize() throws Throwable {
        System.out.print("In Square finalizer: ");
        print();
        super.finalize();  // If you have to write a finalizer, be sure to do this.
    }

    public void print() {
        System.out.print("Square print: mfLength = " + mfLength + " ");
        super.print();
    }
}
 

Main.java

public class Main
{
    final static int MAX = 3;  // An example of a constant class member variable.

    public static void main(String[] args)
    {
        // Create some Point objects.
        Point a;
        a = new Point();
        a.print();

        Point b;
        b = new Point(2,3);
        b.print();

        Point c = new Point(b);
        c.print();

        // Print out the total number of Shapes created so far.  At this point,
        // no Shapes have been created, however, we can still access static member
        // function Shape.getCount().
        System.out.println("Total number of Shapes = " + Shape.getCount());

        // Create a Circle object and hold on to it using a Shape reference.
        Shape s;
        s = new Circle(a,1);
        s.print(); // This will call the print method in Circle.

        // Create an array of Shapes.
        Shape[] shapeArray;
        shapeArray = new Shape[MAX];  // An array of Shape references.

        shapeArray[0] = new Square();
        shapeArray[1] = new Circle(4,5,2);
        shapeArray[2] = new Square(3,3,1);

        // Print out the array of Shapes.  The length member gives the array size.
        for (int i = 0; i < shapeArray.length; i++) {
            shapeArray[i].print();
        }

        // Print out the total number of Shapes created so far.  At this point,
        // 4 Shapes have been created.
        System.out.println("Total number of Shapes = " + Shape.getCount());

        // We can mark the objects for destruction by removing all references to
        // them.  Normally, we do not need to call the garbage collector explicitly.
        // Note: here we have not provided a way to decrement the Shape counter.
        a = b = c = null;
        s = null;
        for (int i = 0; i < shapeArray.length; i++) {
            shapeArray[i] = null;
        }
        shapeArray = null;
    }
}