Presentation is loading. Please wait.

Presentation is loading. Please wait.

CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Ganesh Viswanathan Interfaces (Part II) Course Lecture Slides 28 June 2010 A picture is.

Similar presentations


Presentation on theme: "CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Ganesh Viswanathan Interfaces (Part II) Course Lecture Slides 28 June 2010 A picture is."— Presentation transcript:

1 CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Ganesh Viswanathan Interfaces (Part II) Course Lecture Slides 28 June 2010 A picture is worth a thousand words. An interface is worth a thousand pictures. -Ben Shneiderman

2 Interface Language construct that specifies functionality without any hint at implementation. An interface contains method specifications but no method implementations. 2

3 Comparable Interface // Interface defined in java.lang package public interface Comparable { public int compareTo(Object o); } 3 compareTo( ) Compares this object with the specified object for order. Returns a negative integer, zero or a positive integer when this object is less than, equal to or greater than the specified object. Throws: ClassCastException if the specified object's type prevents it from being compared to this Object.ClassCastException

4 Declaring Classes to Implement Comparable 4

5 5 public class ComparableRectangle extends Rectangle implements Comparable { public ComparableRectangle(double width, double height){ super(width, height); } // Implement the compareTo method defined in Comparable public int compareTo(Object o) { ComparableRectangle cr = (ComparableRectangle)o; if (getArea() > cr.getArea()) return 1; else if(getArea() < cr.getArea()) return -1; else return 0; }

6 Using Arrays.sort() If you have an array of objects of some class C and you want to use Arrays.sort(Object[] a)Object or Arrays.sort(Object[] a, int fromIndex, int toIndex)Object to sort this array, you must make class C implement Comparable interface The above sort() methods use the compareTo() method to compare two array elements of reference type 6

7 Arrays.Sort() What if you want to sort this array of objects in order of different attributes of class C at different times? Solution: Use Arrays.sort(Object[] a, Comparator c)ObjectComparator Or Arrays.sort(Object[] a, int fromIndex, int toIndex, Comparator c)ObjectComparator 7

8 Comparator Interface public interface Comparator { public int compare(Object o1, Object o2)Object } Returns: a negative integer, zero, or a positive integer when the first argument is less than, equal to, or greater than the second. Throws: ClassCastException - if the arguments' types prevent them from being compared by this Comparator.ClassCastException 8

9 Solution Create a class that implements the Comparator interfaceComparator Code the compare() method to define the ordering between objects of this class Pass an instance of this class to the Arrays.Sort() method 9

10 Another scenario What if you are using a class C which does not implement the Comparable interface You do not have access to C.java file You only have access to the C.class file And you want to sort an arrays of objects of class C in order of some attribute of the class 10

11 Solution Create a class that implements the Comparator interface Code the compare() method to define the ordering between objects of this class 11

12 Another Advantage of using interfaces as data types 12 public class Max { public static Comparable max(? o1, ? o2) { if (o1.compareTo(o2) > 0) return o1; else return o2; } ComparableRectangle rectangle1 = new ComparableRectangle(4, 5); ComparableRectangle rectangle2 = new ComparableRectangle(3, 6); System.out.println(Max.max(rectangle1, rectangle2));

13 Another Advantage of using interfaces as data types 13 public class Max { public static Comparable max(Comparable o1, Comparable o2) { if (o1.compareTo(o2) > 0) return o1; else return o2; } ComparableRectangle rectangle1 = new ComparableRectangle(4, 5); ComparableRectangle rectangle2 = new ComparableRectangle(3, 6); System.out.println(Max.max(rectangle1, rectangle2));

14 Interfaces, cont Max method in (a) is more robust.

15 Get more info! Tutorial: http://lkamal.blogspot.com/2008/07/java-sorting-comparator-vs-comparable.html Comparable vs Comparator: http://grdurand.com/static/presentation_four/comparable.html Using comparable: http://onjava.com/pub/a/onjava/2003/03/12/java_comp.html 15

16 The Cloneable Interface It is a Marker Interface i.e. it does not contain constants or methods. Defined in the java.lang package as follows:as follows package java.lang; public interface Cloneable { } 16

17 Examples Many classes (e.g., Date and Calendar) in the Java library implement Cloneable. Thus, the instances of these classes can be cloned. For example, the following code displays Calendar calendar = new GregorianCalendar(2003, 2, 1); Calendar calendarCopy = (Calendar)calendar.clone(); System.out.println("calendar == calendarCopy is " + (calendar == calendarCopy)); System.out.println("calendar.equals(calendarCopy) is " + calendar.equals(calendarCopy)); calendar == calendarCopy is false calendar.equals(calendarCopy) is true

18 Implementing Cloneable Interface A class that implements the Cloneable interface must override the clone() method in the Object class. 18

19 19 public class House implements Cloneable{ private int id; private double area; public House(int id, double area) { this.id = id; this.area = area; } public double getId() { return id; } public double getArea() { return area; } public Object clone() throws CloneNotSupportedException { return super.clone(); }

20 20 public class House implements Cloneable{ private int id; private double area; private java.util.Date whenBuilt; public House(int id, double area) { this.id = id; this.area = area; whenBuilt = new java.util.Date(); } public double getId() { return id; } public double getArea() { return area; } public java.util.Date getWhenBuilt(){ return whenBuilt; } public Object clone() throws CloneNotSupportedException { return super.clone(); }

21 Shallow vs. Deep Copy 21 House house1 = new House(1, 1750.50); House house2 = (House)house1.clone();

22 22 public class House implements Cloneable{ private int id; private double area; private java.util.Date whenBuilt; // other code public Object clone() throws CloneNotSupportedException { House house = (House)super.clone(); house.whenBuilt = (java.util.Date)(whenBuilt.clone()); return house; }

23 23 public class House implements Cloneable{ private int id; private double area; private String name; public House(int id, double area) { this.id = id; this.area = area; whenBuilt = new java.util.Date(); } public double getId() { return id; } public double getArea() { return area; } public java.util.Date getWhenBuilt(){ return whenBuilt; } public Object clone() throws CloneNotSupportedException { return super.clone(); } Is the clone() method doing deep copy?

24 Can the clone() method be written as follows? class House implements Cloneable { private int numberOfRooms; private int squareFeet; //... public Object clone() throws CloneNotSupportedException { return new House(numberOfRooms, squareFeet); } 24

25 What happens when the following code is executed? public class MultiStoryHouse extends House { private int numberOfStories; public MultiStoryHouse(int numRooms, int sqFootage, int numStories) { super(numRooms, sqFootage); numberofStories = numStories; } // no clone method defined } public class Driver { public static void main(String[] args) { MultiStoryHouse tsh = new MultiStoryHouse(6, 3000, 2); MultiStoryHouse other = (MultiStoryHouse)tsh.clone(); //Exception } 25


Download ppt "CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Ganesh Viswanathan Interfaces (Part II) Course Lecture Slides 28 June 2010 A picture is."

Similar presentations


Ads by Google