1. 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 + ")");
}
}
2. 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.
}
}
3. 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();
}
}
4. 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();
}
}
5. 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;
}
}