Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Intro_Java_brief_Liang2011.pdf
Скачиваний:
195
Добавлен:
26.03.2016
Размер:
10.44 Mб
Скачать

476 Chapter 14

Abstract Classes and Interfaces

 

howToEat() method in an interface and let it serve as a common supertype for other classes.

 

For example,

 

public static void main(String[] args) {

 

 

 

Edible stuff = new Chicken();

 

 

 

 

eat(stuff);

 

 

 

 

 

 

 

 

stuff = new Duck();

 

 

 

 

 

eat(stuff);

 

 

 

 

 

 

 

 

 

stuff = new Broccoli();

 

 

 

 

 

eat(stuff);

 

}

 

 

 

 

 

 

 

 

 

public static void eat(Edible stuff) {

 

 

 

stuff.howToEat();

 

 

 

 

 

}

 

 

 

 

 

 

 

 

Edible interface

interface Edible {

 

 

 

public String howToEat()

;

 

 

}

 

 

 

 

 

 

 

 

Chicken class

class Chicken implements Edible {

 

 

 

public String howToEat()

{

 

 

 

 

return "Fry it";

 

}

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

Duck class

class Duck implements Edible {

 

 

 

public String howToEat()

{

 

 

 

 

return "Roast it";

 

}

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

Broccoli class

class Broccoli implements Edible {

 

 

 

public String howToEat()

{

 

 

 

 

return "Stir-fry it";

 

}

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

To define a class that represents edible objects, simply let the class implement the Edible

 

interface. The class is now a subtype of the Edible type. Any Edible object can be passed

 

to invoke the eat method.

14.9 Processing Primitive Data Type Values as Objects

Owing to performance considerations, primitive data types are not used as objects in Java. Because of the overhead of processing objects, the language’s performance would be adversely affected if primitive data types were treated as objects. However, many Java methods require the use of objects as arguments. For example, the add(object) method in the ArrayList class adds an object to an ArrayList. Java offers a convenient way to incorporate, or wrap, a primitive data type into an object (e.g., wrapping int into the Integer class,

why wrapper class? and wrapping double into the Double class). The corresponding class is called a wrapper class. By using a wrapper object instead of a primitive data type variable, you can take advantage of generic programming.

Java provides Boolean, Character, Double, Float, Byte, Short, Integer, and Long wrapper classes for primitive data types. These classes are grouped in the java.lang package. Their inheritance hierarchy is shown in Figure 14.8.

14.9 Processing Primitive Data Type Values as Objects 477

Comparable

Object

why wrapper class?

 

 

Number

Character

Boolean

Double Float Long Integer Short Byte

FIGURE 14.8 The Number class is an abstract superclass for Double, Float, Long,

Integer, Short, and Byte.

Note

Most wrapper class names for a primitive type are the same as the primitive data type name with

naming convention

the first letter capitalized. The exceptions are Integer and Character.

 

Each numeric wrapper class extends the abstract Number class, which contains the methods doubleValue(), floatValue(), intValue(), longValue(), shortValue(), and byteValue(). These methods “convert” objects into primitive type values. Each wrapper class overrides the toString and equals methods defined in the Object class. Since all the wrapper classes implement the Comparable interface, the compareTo method is implemented in these classes.

Wrapper classes are very similar to each other. The Character class was introduced in Chapter 9, “Strings and Text I/O.” The Boolean class wraps a Boolean value true or false. This section uses Integer and Double as examples to introduce the numeric wrapper classes. The key features of Integer and Double are shown in Figure 14.9.

java.lang.Number

 

 

 

java.lang.Integer

 

 

 

 

 

 

 

 

+byteValue(): byte

 

 

 

-value: int

+shortValue(): short

 

 

 

+MAX_VALUE: int

+intValue(): int

 

 

 

+MIN_VALUE: int

+longValue(): long

 

 

 

 

 

 

 

 

+floatValue(): float

 

 

 

+Integer(value: int)

+doubleValue(): double

 

 

 

+Integer(s: String)

 

 

 

 

+valueOf(s: String): Integer

 

 

 

 

 

 

 

 

+valueOf(s: String, radix: int): Integer

«interface»

 

 

 

 

 

 

+parseInt(s: String): int

java.lang.Comparable

 

 

 

+parseInt(s: String, radix: int): int

 

 

 

 

 

+compareTo(o: Object): int

 

 

 

 

 

 

 

 

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

 

 

 

 

 

FIGURE 14.9 The wrapper classes provide constructors, constants, and conversion methods for manipulating various data types.

478 Chapter 14

Abstract Classes and Interfaces

constructors

You can construct a wrapper object either from a primitive data type value or from a string

 

representing the numeric value—for example, new Double(5.0), new Double("5.0"),

 

new Integer(5), and new Integer("5").

no no-arg constructor

The wrapper classes do not have no-arg constructors. The instances of all wrapper classes

immutable

are immutable; this means that, once the objects are created, their internal values cannot be

 

changed.

constants

Each numeric 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 val-

 

ues. For Float and Double, MIN_VALUE represents the minimum positive float and

 

double values. The following statements display the maximum integer (2,147,483,647), the

 

minimum positive float 11.4E -452, and the maximum double floating-point number

 

11.79769313486231570e + 308d2.

 

System.out.println("The maximum integer is " + Integer.MAX_VALUE);

 

System.out.println("The minimum positive float is " +

 

Float.MIN_VALUE);

 

System.out.println(

 

"The maximum double-precision floating-point number is " +

 

Double.MAX_VALUE);

conversion methods

Each numeric wrapper class implements the abstract methods doubleValue(),

 

floatValue(), intValue(), longValue(), and shortValue(), which are defined in

 

the Number class. These methods return a double, float, int, long, or short value for

 

the wrapper object.

static valueOf methods

The numeric wrapper classes have a useful static method, valueOf(String s). This

 

method creates a new object initialized to the value represented by the specified string. For

 

example,

 

Double doubleObject = Double.valueOf("12.4");

 

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

static parsing methods

You have used the parseInt method in the Integer class to parse a numeric string into an

 

int value and the parseDouble method in the Double class to parse a numeric string into

 

a double value. Each numeric wrapper class has two overloaded parsing methods to parse a

 

numeric string into an appropriate numeric value based on 10 (decimal) or any specified

 

radix (e.g., 2 for binary, 8 for octal, and 16 for hexadecimal). These methods are shown

 

below:

 

// These two methods are in the Byte class

 

public static byte parseByte(String s)

 

public static byte parseByte(String s, int radix)

 

// These two methods are in the Short class

 

public static short parseShort(String s)

 

public static short parseShort(String s, int radix)

 

// These two methods are in the Integer class

 

public static int parseInt(String s)

 

public static int parseInt(String s, int radix)

 

// These two methods are in the Long class

 

public static long parseLong(String s)

 

public static long parseLong(String s, int radix)

 

// These two methods are in the Float class

 

public static float parseFloat(String s)

 

public static float parseFloat(String s, int radix)

14.10 Sorting an Array of Objects 479

// These two methods are in the Double class public static double parseDouble(String s)

public static double parseDouble(String s, int radix)

For example,

Integer.parseInt("11", 2) returns 3;

Integer.parseInt("12", 8) returns 10;

Integer.parseInt("13", 10) returns 13;

Integer.parseInt("1A", 16) returns 26;

Integer.parseInt("12", 2) would raise a runtime exception because 12 is not a binary number.

14.10 Sorting an Array of Objects

This example presents a static generic method for sorting an array of comparable objects. The objects are instances of the Comparable interface, and they are compared using the compareTo method. The method can be used to sort an array of any objects as long as their classes implement the Comparable interface.

To test the method, the program sorts an array of integers, an array of double numbers, an array of characters, and an array of strings. The program is shown in Listing 14.10.

LISTING 14.10 GenericSort.java

1 public class GenericSort {

2 public static void main(String[] args) {

3// Create an Integer array

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

6

7// Create a Double array

8 Double[] doubleArray = {new Double(3.4), new Double(1.3), 9 new Double(-22.1)};

10

11// Create a Character array

12Character[] charArray = {new Character('a'),

13new Character('J'), new Character('r')};

15// Create a String array

16String[] stringArray = {"Tom", "John", "Fred"};

18// Sort the arrays

19sort(intArray);

20sort(doubleArray);

21sort(charArray);

22sort(stringArray);

24// Display the sorted arrays

25System.out.print("Sorted Integer objects: ");

26printList(intArray);

27System.out.print("Sorted Double objects: ");

28printList(doubleArray);

29System.out.print("Sorted Character objects: ");

30printList(charArray);

31System.out.print("Sorted String objects: ");

32printList(stringArray);

33}

34

sort Integer objects sort Double objects sort Character objects sort String objects

480 Chapter 14

Abstract Classes and Interfaces

 

35

 

/** Sort an array of comparable objects */

generic sort method

36

 

public static void sort(Comparable[] list)

{

 

37

 

Comparable currentMin;

 

38

 

int currentMinIndex;

 

39

 

 

 

 

40

 

for (int i = 0; i < list.length - 1; i++) {

 

41

 

// Find the maximum in the list[0..i]

 

42

 

currentMin = list[i];

 

43

 

currentMinIndex = i;

 

44

 

 

 

 

45

 

for (int j = i + 1; j < list.length; j++) {

compareTo

46

 

if (currentMin.compareTo(list[j]) > 0) {

 

47

 

currentMin = list[j];

 

48

 

currentMinIndex = j;

 

49

}

 

 

50

}

 

 

51

 

 

 

 

52

 

// Swap list[i] with list[currentMinIndex] if necessary;

 

53

 

if (currentMinIndex != i) {

 

54

 

list[currentMinIndex] = list[i];

 

55

 

list[i] = currentMin;

 

56

}

 

 

57

}

 

 

58

}

 

 

59

 

 

 

60/** Print an array of objects */

61public static void printList(Object[] list) {

62for (int i = 0; i < list.length; i++)

63System.out.print(list[i] + " ");

64System.out.println();

65}

66}

Sorted Integer objects: 2 3 4

Sorted Double objects: -22.1 1.3 3.4

Sorted Character objects: J a r

Sorted String objects: Fred John Tom

The algorithm for the sort method is the same as in §6.10.1, “Selection Sort.” The sort method in §6.10.1 sorts an array of double values. The sort method in this example can sort an array of any object type, provided that the objects are also instances of the Comparable interface. This is another example of generic programming. Generic programming enables a method to operate on arguments of generic types, making it reusable with multiple types.

Integer, Double, Character, and String implement Comparable, so the objects of these classes can be compared using the compareTo method. The sort method uses the compareTo method to determine the order of the objects in the array.

 

Tip

Arrays.sort method

Java provides a static sort method for sorting an array of any object type in the

 

java.util.Arrays class, provided that the elements in the array are comparable. Thus 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);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]