/** * This code is from the book: * Winder, R and Roberts, G (1998) * Developing Java Software</em> * John Wiley & Sons. * It is copyright (c) 1997 Russel Winder * and Graham Roberts. */ import java.util.Date; class l1Inherit10{//ObjectMethods: extends Object by default private int i; private Date d; private String[] s; public l1Inherit10(int a, Date b, String[] c){ i = a; d = b; s = c; //Array is not copied } //A private constructor used when cloning //an object. It does no initialization as //cloning will overwrite any values. private l1Inherit10() { } //Override equals to compare the value of //the argument with this. public boolean equals(Object obj){ //Check for testing equality with //self and shortcut everything else if (this == obj) return true; //Check that the argument object is an instance //of the same class, as the argument is given //type object not the type of this class. //First check if the argument is null. //Note the use of the || operator which only //evaluates its right hand argument //if the left is false. if ((obj == null) || !(obj instanceof l1Inherit10)) return false; //Can't be equal! //Cast argument back to correct type l1Inherit10 tmp = (l1Inherit10)obj; //Next compare the value of each instance variable //Primitive types can be compared using the //boolean operators if (i != tmp.i) return false; //objects of class types need to be compared //using equals unless it is sufficient that //both references are referencing the same object if (!d.equals(tmp.d)) return false; //An array is an object. == or equals will //only check if two references reference the //same object, so a loop is needed to iterate //through each array comparing elements. //The arrays need to be the same length. if (s.length != tmp.s.length) return false; for (int i = 0; i < s.length; i++){ if (!s[i].equals(tmp.s[i])) return false; } return true; //Same value } //Generate a String representation of an object public String toString(){ //Use a Stringbuffer to build the String StringBuffer sb = new StringBuffer(); sb.append("i= " + i + ", "); sb.append("d = " + d + ", " ); sb.append("s = "); for (int i = 0; i < s.length; i++){ sb.append(s[i] + " "); } return sb.toString(); } //Perform a deep copy. //Note that neither Dates or Strings are //copied using clone and constructors //are used instead. public Object clone(){ l1Inherit10 tmp = new l1Inherit10(); tmp.i = i; //Cannot clone dates, so create a new //Date initialized to the value of d //tmp.d = (Date)d.clone(); //Error tmp.d = new Date(d.getTime()); //Copy array element by element, //calling clone for each element. tmp.s = new String[s.length]; for (int i = 0; i < s.length; i++){ tmp.s[i] = new String(s[i]); } return tmp; } //Don't need to override this as the //default does the right thing. //However, it will be for an example. public void finalize(){ //Null all the array elements for (int i = 0; i < s.length; i++){ s[i] = null; } System.out.println("Finalized"); } public static void main(String[] args){ String[] upper = {"A","B","C","D","E"}; String[] lower = {"a","b","c","d","e"}; l1Inherit10 a = new l1Inherit10(1,new Date(),upper); l1Inherit10 b = new l1Inherit10(10,new Date(1,1,2000),lower); System.out.println(a.equals(a)); System.out.println(a.equals(b)); System.out.println(b.equals(a)); System.out.println(b.equals(b)); System.out.println(a); System.out.println(b); b = null;//b is no longer referenced and may //get garbage collected (although that //is very unlikely during the running of //this program as it uses little memory). //Note use of cast when using clone as it //returns a value of type Object l1Inherit10 c = (l1Inherit10)a.clone(); System.out.println(a.equals(c)); System.out.println(c.equals(a)); System.out.println(a); System.out.println(c); } } /******** sample compilation & run ******* # javac l1Inherit10.java Note: l1Inherit10.java uses a deprecated API. Recompile with "-deprecation" fo details. 1 warning # javac -deprecation l1Inherit10.java l1Inherit10.java:125: Note: The constructor java.util.Date(int,int,int) has been deprecated. new l1Inherit10(10,new Date(1,1,2000),lower); ^ Note: l1Inherit10.java uses a deprecated API. Please consult the documentation for a better alternative. 2 warnings # java l1Inherit10 true false false true i= 1, d = Mon Sep 13 05:20:20 GMT 1999, s = A B C D E i= 10, d = Tue Jul 24 00:00:00 GMT 1906, s = a b c d e true true i= 1, d = Mon Sep 13 05:20:20 GMT 1999, s = A B C D E i= 1, d = Mon Sep 13 05:20:20 GMT 1999, s = A B C D E # ******************************************/