// // "simulation" example: class for managing vehicle registration info // abstract class RegisteredVehicle { String tag ; String registeredTo ; String owner ; // constructor method RegisteredVehicle(String t, String r, String o) { tag = t ; registeredTo = r ; owner = o ; } // additional methods // re-register void reregister(String r, String o) { registeredTo = r ; owner = o ; } // print info void printRegistration() { System.out.println("Tag: " + tag) ; System.out.println("Registered to: " + registeredTo) ; System.out.println("Owner: " + owner) ; } // get annual fee abstract int getAnnualFee() ; } class RegistrationException extends Exception { RegistrationException(String s) { super(s) ; } } abstract class RegisteredMotorVehicle extends RegisteredVehicle { int emptyWeight ; int lastOdometer ; // at registration // constructor method RegisteredMotorVehicle(String t, String r, String o, int w, int l) { super(t, r, o) ; emptyWeight = w ; lastOdometer = l ; } // additional methods // re-register void reregister(String r, String o, int l) throws RegistrationException { if (l < lastOdometer) throw new RegistrationException( "Invalid odometer reading.") ; super.reregister(r, o) ; lastOdometer = l ; } // print info void printRegistration() { super.printRegistration() ; System.out.println("Empty weight: " + emptyWeight) ; System.out.println("Last odometer reading: " + + lastOdometer) ; } // class is still abstract because no getAnnualFee method } class Truck extends RegisteredMotorVehicle { static final int PICKUP = 0, BIGRIG = 1 ; int truckType ; // constructor method Truck(String t, String r, String o, int w, int l, int type) { super(t, r, o, w, l) ; truckType = type ; } // additional methods // print info void printRegistration() { super.printRegistration() ; switch (truckType) { case PICKUP : { System.out.println("Pickup") ; break ; } case BIGRIG : { System.out.println("Big rig") ; break ; } default : System.out.println("Truck") ; } } // implement abstract method int getAnnualFee() { int temp ; switch (truckType) { case PICKUP : { temp = (int) (emptyWeight * .05) ; break ; } case BIGRIG : { temp = (int) (emptyWeight * .01) ; break ; } default : temp = (int) (emptyWeight * .10) ; } return temp ; } } class Auto extends RegisteredMotorVehicle { int doors ; // constructor method Auto(String t, String r, String o, int w, int l, int d) { super(t, r, o, w, l) ; doors = d ; } // additional methods // print info void printRegistration() { super.printRegistration() ; System.out.println(doors + "-door auto") ; } // implement abstract method int getAnnualFee() { return (int) (emptyWeight * .08) ; } } class Cycle extends RegisteredVehicle { static final int UNICYCLE = 0, BICYCLE = 1, TRICYCLE = 2 ; int cycleType ; // constructor method Cycle(String t, String o, int type) { super(t, o, o) ; // always registered to owner cycleType = type ; } // additional methods // print info void printRegistration() { super.printRegistration() ; switch (cycleType) { case UNICYCLE : { System.out.println("Unicycle") ; break ; } case BICYCLE : { System.out.println("Bicycle") ; break ; } case TRICYCLE : { System.out.println("Tricycle") ; break ; } default : System.out.println("Cycle") ; } } // implement abstract method int getAnnualFee() { return 10 ; } } public class RegisteredVehicleTest { public static void main(String[] args) { RegisteredVehicle[] vs = { new Truck("1234XYZ", "J. Smith", "Big Bank", 2000, 20000, Truck.PICKUP), new Truck("2345YXZ", "B. Jones", "Truckers CU", 10000, 40000, Truck.BIGRIG), new Auto("XYZXYZ12", "A. Brown", "A. Brown", 4000, 20000, 4), new Auto("ABABAB12", "S. Green", "Tiny CU", 2000, 120000, 2), new Cycle("ABCD", "A. Tot", Cycle.TRICYCLE), new Cycle("EFGH", "A. Kid", Cycle.BICYCLE) } ; for (int i = 0 ; i < vs.length ; i++) { vs[i].printRegistration() ; System.out.println("Annual fee: $" + vs[i].getAnnualFee()) ; System.out.println("") ; } System.out.println("") ; System.out.println("Change some registration info") ; System.out.println("") ; try { RegisteredMotorVehicle r = (RegisteredMotorVehicle) vs[0] ; r.reregister("J. Smith", "J. Smith", 40000) ; } catch (RegistrationException e) { System.out.println(e.getMessage()) ; } try { RegisteredMotorVehicle r = (RegisteredMotorVehicle) vs[3] ; r.reregister("J. Doe", "J. Doe", 10000) ; } catch (RegistrationException e) { System.out.println(e.getMessage()) ; } System.out.println("") ; for (int i = 0 ; i < vs.length ; i++) { vs[i].printRegistration() ; System.out.println("Annual fee: $" + vs[i].getAnnualFee()) ; System.out.println("") ; } } }