Now we create a Circle class that is a subclass of Point.
// Circle.java // Definition of class Circle import java.awt.Graphics; public class Circle extends Point { // inherits from Point protected double radius; // No-argument constructor public Circle() { // implicit call to superclass constructor occurs here System.out.println("Default Circle constructor called"); } // Constructor public Circle( double a, double b, double r ) { super( a, b ); // call to superclass constructor setRadius( r ); System.out.println("Circle constructor:" + this); } // Set radius of Circle public void setRadius( double r ) { radius = ( r >= 0.0 ? r : 0.0 ); } // Get radius of Circle public double getRadius() { return radius; } // Calculate area of Circle public double area() { return Math.PI * radius * radius; } public void draw(Graphics g) { int nx = (int) (x*SCALE); int ny = (int) (y*SCALE); int r = (int) (radius*SCALE); int w = 2*r+1; g.drawOval(nx-r,ny-r,w,w); } // convert the Circle to a String public String toString() { return " Center =" + super.toString() + "; Radius = " + radius; } }
// Test.java import java.awt.*; import javax.swing.*; public class Test extends JApplet { Circle circ; Point pt; public void init() { pt = new Point(0.1, 0.9); circ = new Circle(0.5,0.5,0.3); } public void destroy() { pt = null; circ = null; System.gc(); } public void paint(Graphics g) { pt.draw(g); circ.draw(g); } }
While applet is running:
After applet is terminated:
// InheritanceTest.java // Demonstrating the "is a" relationship import java.text.DecimalFormat; import javax.swing.JOptionPane; public class InheritanceTest { public static void main( String args[] ) { Point pointRef, p; Circle circleRef, c; String output; p = new Point( .30, .50 ); c = new Circle( 1.20, .89, 0.15 ); output = "Point p: " + p.toString() + "\nCircle c: " + c.toString(); // use the "is a" relationship to refer to a Circle // with a Point reference pointRef = c; // assign Circle to pointRef output += "\n\nCircle c (via pointRef): " + pointRef.toString(); // Use downcasting (casting a superclass reference to a // subclass data type) to assign pointRef to circleRef circleRef = (Circle) pointRef; output += "\n\nCircle c (via circleRef): " + circleRef.toString(); DecimalFormat precision4 = new DecimalFormat( "0.0000" ); output += "\nArea of c (via circleRef): " + precision4.format( circleRef.area() ); // Attempt to refer to Point object // with Circle reference if ( p instanceof Circle ) { circleRef = (Circle) p; output += "\n\ncast successful"; } else output += "\n\np does not refer to a Circle"; JOptionPane.showMessageDialog( null, output, "Demonstrating the \"is a\" relationship", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } }
// Point.java // Definition of class Point (simple) import java.awt.Graphics; /** * Point describes a two-dimensional point. */ public class Point { static final double SCALE = 100; public double x, y; // coordinates of the Point // No-argument constructor public Point() { System.out.println("Point (no-argument constructor called"); } // Constructor public Point( double a, double b ) { setPoint( a, b ); System.out.println("Point constructor:" + this); } protected void finalize() { System.out.println("Point finalizer:"+this); } // Set x and y coordinates of Point public void setPoint( double a, double b ) { x = a; y = b; } public void draw(Graphics g) { int nx = (int) (x*SCALE); int ny = (int) (y*SCALE); g.fillOval(nx-5,ny-5,11,11); } // convert the point into a String representation public String toString() { return " (" + x + ", " + y + ")"; } }
Maintained by John Loomis, last updated 6 June 2000