Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method:...

39
Chapter 11 Abstract Classes and Interfaces 1

Transcript of Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method:...

Page 1: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Chapter 11 Abstract Classes and Interfaces

1

Page 2: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Abstract method

•New modifier for class and method: abstract

•An abstract method has no body•Compare: abstract and concrete.

2

Page 3: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Abstract Classes and Abstract Methods

3

GeometricObject -color: String

-filled: boolean

-dateCreated: java.util.Date

#GeometricObject()

+getColor(): String

+setColor(color: String): void

+isFilled(): boolean

+setFilled(filled: boolean): void

+getDateCreated(): java.util.Date

+toString(): String

+getArea(): double

+getPerimeter(): double

Circle

-radius: double

+Circle()

+Circle(radius: double)

+getRadius(): double

+setRadius(radius: double): void

+getDiameter(): double

Rectangle -width: double

-height: double

+Rectangle()

+Rectangle(width: double, height: double)

+getWidth(): double

+setWidth(width: double): void

+getHeight(): double

+setHeight(height: double): void

The # sign indicates protected modifer

Abstract class

Abstract methods

Methods getArea and getPerimeter are overridden in Circle and Rectangle. Overridden methods are generally omitted in the UML diagram for subclasses.

GeometricObjectGeometricObject

CircleCircle

RectangleRectangle

TestGometricObjectTestGometricObject

RunRun

Page 4: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

abstract method in abstract class

4

An abstract method -> must be abstract class.

Subclass of an abstract superclass does not override all abstract methods -> must be abstract.

A class can be abstract with no abstract methods.

Page 5: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

object cannot be created from abstract class

5

Can have variable of abstract class type

An abstract class cannot be instantiated using the new operator

Can have constructors - invoked by subclasses.

Page 6: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

superclass of abstract class may be concrete

6

If a class is concrete, does that mean all subclasses are concrete?

NO!

Object class is concrete, but we can still have abstract classes.

Page 7: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

concrete method overridden to be abstract

7

A subclass can override a concrete method from its (perhaps concrete) superclass to declare it abstract.

Rare, but useful when superclass implementation becomes invalid in the subclass.

Page 8: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Interfaces

What is an interface?Why is an interface useful?How do you define an interface?How do you use an interface?

8

Page 9: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

What is an interface? Why is an interface useful?

like a class, but contains only constants and abstract methods In many ways, similar to an abstract class purpose: specify behavior for objects For example, specify that the objects are

comparable edible cloneable

9

Page 10: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Define an InterfaceTo distinguish an interface from a class, Java uses the following syntax to declare an interface:

10

public interface InterfaceName { constant declarations; method signatures;}

Example:

public interface Edible {

/** Describe how to eat */

public abstract String howToEat();

}

Page 11: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Interface is a Special Class

Treated like special class in Java Each interface is compiled into a separate bytecode file cannot create an instance from an interface using the new operatorcan use interface as data type for a variable

11

Page 12: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Omitting Modifiers in InterfacesFields are public final static

Methods are public abstract in an interface.

Thus, these modifiers can be omitted

12

public interface T1 { public static final int K = 1; public abstract void p(); }

Equivalent public interface T1 { int K = 1; void p(); }

A constant defined in an interface can be accessed using syntax InterfaceName.CONSTANT_NAME (e.g., T1.K).

Page 13: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Example: The Comparable Interface// This interface is defined in // java.lang packagepackage java.lang;

public interface Comparable { public int compareTo(Object o);}

13

Page 14: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

String and Date Classes

Many classes (e.g., String and Date) in the Java library implement Comparable to define a natural order for the objects. If you examine the source code of these classes, you will see the keyword implements used in the classes, as shown below:

14

public class String extends Object implements Comparable { // class body omitted

}

public class Date extends Object implements Comparable { // class body omitted

}

new String() instanceof Stringnew String() instanceof Comparablenew java.util.Date() instanceof java.util.Datenew java.util.Date() instanceof Comparable

Page 15: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Generic max Method

The return value from the max method is of the Comparable type. So, you need to cast it to String or Date explicitly.

15

// Max.java: Find a maximum object public class Max { /** Return the maximum of two objects */ public static Object max (Object o1, Object o2) { if (((Comparable)o1).compareTo(o2) > 0) return o1; else return o2; } }

(a)

// Max.java: Find a maximum object public class Max { /** Return the maximum of two objects */ public static Comparable max (Comparable o1, Comparable o2) { if (o1.compareTo(o2) > 0) return o1; else return o2; } }

(b)

String s1 = "abcdef"; String s2 = "abcdee"; String s3 = (String)Max.max(s1, s2);

Date d1 = new Date(); Date d2 = new Date(); Date d3 = (Date)Max.max(d1, d2);

Page 16: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Declaring Classes to Implement Comparable

You cannot use the max method to find the larger of two instances of Rectangle, because Rectangle does not implement Comparable. However, you can declare a new rectangle class that implements Comparable. The instances of this new class are comparable. Let this new class be named ComparableRectangle.

16

ComparableRectangleComparableRectangle

ComparableRectangle rectangle1 = new ComparableRectangle(4, 5);

ComparableRectangle rectangle2 = new ComparableRectangle(3, 6);

System.out.println(Max.max(rectangle1, rectangle2));

Rectangle -

GeometricObject -

«interface» java.lang.Comparable

+compareTo(o: Object): int

Notation: The interface name and the method names are italicized. The dashed lines and hollow triangles are used to point to the interface.

ComparableRectangle -

Page 17: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

The Cloneable Interfaces

package java.lang;public interface Cloneable { }

17

Marker Interface: An empty interface.

A marker interface does not contain constants or methods.

Used to denote that a class possesses certain properties.

A class that implements the Cloneable interface is marked cloneable, and its objects can be cloned using the clone() method defined in the Object class.

Page 18: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

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

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));

 displays

calendar == calendarCopy is falsecalendar.equals(calendarCopy) is true  

18

Page 19: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Shallow vs. Deep Copy19

house1: House

id = 1

area = 1750.50

whenBuilt

1

Memory

whenBuilt: Date date object contents house2 = house1.clone()

1750.50

reference

house1: House

id = 1

area = 1750.50

whenBuilt

1

Memory

1750.50

reference

House house1 = new House(1, 1750.50);

House house2 = (House)house1.clone();

Page 20: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Interfaces vs. Abstract Classes

In an interface, the data must be constants; an abstract class can have all types of data.

Each method in an interface has only a signature without implementation; an abstract class can have concrete methods.

20

Variables Constructors Methods

Abstract class

No restrictions Constructors are invoked by subclasses through constructor chaining. An abstract class cannot be instantiated using the new operator.

No restrictions.

Interface All variables must be public static final

No constructors. An interface cannot be instantiated using the new operator.

All methods must be public abstract instance methods

Page 21: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Interfaces vs. Abstract Classes, cont.

Suppose that c is an instance of Class2. c is also an instance of Object, Class1, Interface1, Interface1_1, Interface1_2, Interface2_1, and Interface2_2.

21

Object Class1

Interface1 Interface1_1

Interface1_2

Class2

Interface2_1

Interface2_2

Only 1 base class, can implement multiple interfaces.

Interfaces can be used for multiple inheritance.

Page 22: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Caution: conflict interfaces In rare occasions, a class may implement two interfaces with conflict information (e.g., two same constants with different values or two methods with same signature but different return type). This type of errors will be detected by the compiler.

22

Page 23: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Wrapper Classes

• Boolean

• Character

• Short

• Byte

23

Integer Long

Float

Double

java.lang.Object

-

Double -

Float -

Long -

Integer -

Short -

Byte -

Character -

Boolean -

Number -

java.lang.Comparable -

NOTE: (1) The wrapper classes do not have no-arg constructors. (2) The instances of all wrapper classes are immutable, i.e., their internal values cannot be changed once the objects are created.

Page 24: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

The toString, equals, and hashCode Methods

Each wrapper class overrides the toString, equals, and hashCode methods defined in the Object class. Since all the numeric wrapper classes and the Character class implement the Comparable interface, the compareTo method is implemented in these classes.

24

Page 25: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

The Number Class •Each numeric wrapper class extends the abstract Number class

▫Contains methods doubleValue, floatValue, intValue, longValue, shortValue, and byteValue.

•These methods “convert” objects into primitive type values. •doubleValue, floatValue, intValue, longValue are abstract. •byteValue and shortValue are not abstract

▫return (byte)intValue() and (short)intValue(), respectively.

•Is Number class concrete or abstract?

25

Page 26: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

The Integer and Double Classes26

java.lang.Integer

-value: int +MAX_VALUE: int +MIN_VALUE: int +Integer(value: int) +Integer(s: String) +valueOf(s: String): Integer +valueOf(s: String, radix: int): Integer +parseInt(s: String): int +parseInt(s: String, radix: int): int

java.lang.Number +byteValue(): byte +shortValue(): short +intValue(): int +longVlaue(): long +floatValue(): float +doubleValue():double

java.lang.Double

-value: double +MAX_VALUE: double +MIN_VALUE: double +Double(value: double) +Double(s: String) +valueOf(s: String): Double +valueOf(s: String, radix: int): Double +parseDouble(s: String): double +parseDouble (s: String, radix: int): double

java.lang.Comparable +compareTo(o: Object): int

Page 27: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

The Integer Classand the Double Class

•Constructors

•Class Constants MAX_VALUE, MIN_VALUE

•Conversion Methods

27

Page 28: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Numeric Wrapper Class Constructors

You can construct a wrapper object either from a primitive data type value or from a string representing the numeric value.

Constructors for Integer:

public Integer(int value)

public Integer(String s)

Constructors for Double are

public Double(double value)

public Double(String s)

28

Page 29: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Numeric Wrapper Class Constants

•Each numerical wrapper class has the constants MAX_VALUE and MIN_VALUE.

•MAX_VALUE represents the maximum value of the corresponding primitive data type.

•For Byte, Short, Integer, and Long, MIN_VALUE represents the minimum byte, short, int, and long values.

•For Float and Double, MIN_VALUE represents the minimum positive float and double values.

29

Page 30: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Conversion Methods•Each numeric wrapper class implements abstract methods which are defined in the Number class.

▫doubleValue

▫floatValue,

▫intValue,

▫longValue,

▫shortValue,

•These methods “convert” objects into primitive type values.

30

Page 31: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

The Static valueOf Methods•The numeric wrapper classes have a class method, valueOf(String s).

•Creates a new object with the value represented by the String.

•For example:Double doubleObject =

Double.valueOf("12.4");

Integer integerObject = Integer.valueOf("12");

31

Page 32: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

The Methods for Parsing Strings into Numbers

•Each numeric wrapper class has overloaded parsing methods to parse a numeric string into a primitive numeric value.

•parseInt in the Integer class parses a numeric string into an int value.

•parseDouble in the Double class parses a numeric string into a double value.

32

Page 33: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Sorting an Array of Objects

Objective: The example presents a generic method for sorting an array of objects. The objects are instances of the Comparable interface and they are compared using the compareTo method.

33

GenericSortGenericSort RunRun

Page 34: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

TIP

Java provides a static sort method for sorting an array of Object in the java.util.Arrays class. So you can use the following code to sort arrays in this example:

java.util.Arrays.sort(intArray);java.util.Arrays.sort(doubleArray);java.util.Arrays.sort(charArray);java.util.Arrays.sort(stringArray);

34

Page 35: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

NOTE

Arrays are objects. An array is an instance of the Object class. Furthermore, if A is a subclass of B, every instance of A[] is an instance of B[]. Therefore, the following statements are all true:

new int[10] instanceof Objectnew GregorianCalendar[10] instanceof

Calendar[];new Calendar[10] instanceof Object[] new Calendar[10] instanceof Object

35

Page 36: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

CAUTION

• An int value can be assigned to a double type variable.

• Yet int[] and double[] are two incompatible types.

• Therefore, you cannot assign an int[] array to a variable of double[] or Object[] type.

36

Page 37: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

Automatic Conversion Between Primitive Types and Wrapper Class Types

JDK 1.5 allows primitive type and wrapper classes to be converted automatically. For example, the following statement in (a) can be simplified as in (b):

37

Integer[] intArray = {new Integer(2), new Integer(4), new Integer(3)};

(a)

Equivalent

(b)

Integer[] intArray = {2, 4, 3};

New JDK 1.5 boxing

Integer[] intArray = {1, 2, 3};System.out.println(intArray[0] + intArray[1] + intArray[2]);

Unboxing

Page 38: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

BigInteger and BigDecimal

For computation with very large integers or high precision floating-point values, use the BigInteger and BigDecimal classes in the java.math package. Both are immutable. Both extend the Number class and implement the Comparable interface.

38

Page 39: Chapter 11 Abstract Classes and Interfaces 1. Abstract method New modifier for class and method: abstract An abstract method has no body Compare: abstract.

BigInteger and BigDecimalBigInteger a = new BigInteger("9223372036854775807");BigInteger b = new BigInteger("2");BigInteger c = a.multiply(b); // 9223372036854775807 * 2System.out.println(c);

39

BigDecimal a = new BigDecimal(1.0);

BigDecimal b = new BigDecimal(3);

BigDecimal c = a.divide(b, 20, BigDecimal.ROUND_UP);

System.out.println(c);

LargeFactorialLargeFactorial RunRun