1.124 Lecture 11 - Supplement | 10/17/2000 |
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;
}
}