Overview. ITI Introduction to Computing II. Interface 1. Problem 1. Problem 1: Array sorting. Problem 1: Array sorting. Problem 1: Array sorting

Similar documents
ITI Introduction to Computing II

ITI Introduction to Computing II

ITI Introduction to Computing II

ITI Introduction to Computing II

ITI Introduction to Computing II

index.pdf January 21,

CS/ENGRD 2110 SPRING Lecture 7: Interfaces and Abstract Classes

CS/ENGRD 2110 FALL Lecture 7: Interfaces and Abstract Classes

Abstract Classes. Abstract Classes a and Interfaces. Class Shape Hierarchy. Problem AND Requirements. Abstract Classes.

CS/ENGRD 2110 SPRING 2018

Chapter 11 Inheritance and Polymorphism. Motivations. Suppose you will define classes to model circles,

CS250 Intro to CS II. Spring CS250 - Intro to CS II 1

Inheritance and Polymorphism

Object Oriented Programming in Java. Jaanus Pöial, PhD Tallinn, Estonia

Constructor. Liang, Introduction to Java Programming, Tenth Edition, (c) 2013 Pearson Education, Inc. All rights reserved.

Polymorphism: Interfaces and Iteration. Fundamentals of Computer Science

Chapter 14 Abstract Classes and Interfaces

CS 112 Programming 2. Lecture 06. Inheritance & Polymorphism (1) Chapter 11 Inheritance and Polymorphism

Java Object Oriented Design. CSC207 Fall 2014

ITI Introduction to Computing II

Introduction to Computer Science II (ITI 1121) Midterm Examination

Inheritance, Polymorphism, and Interfaces

Inheritance & Polymorphism Recap. Inheritance & Polymorphism 1

COS226 - Spring 2018 Class Meeting # 13 March 26, 2018 Inheritance & Polymorphism

Object-oriented programming. and data-structures CS/ENGRD 2110 SUMMER 2018

Lecture Notes Chapter #9_b Inheritance & Polymorphism

CS 61B Data Structures and Programming Methodology. July 2, 2008 David Sun

Abstract Class. Lecture 21. Based on Slides of Dr. Norazah Yusof

The Liskov Substitution Principle

M301: Software Systems & their Development. Unit 4: Inheritance, Composition and Polymorphism

Chapter 4 Defining Classes I

Chapter 10 Inheritance and Polymorphism. Dr. Hikmat Jaber

Making New instances of Classes

CSC 1214: Object-Oriented Programming

Lecture 36: Cloning. Last time: Today: 1. Object 2. Polymorphism and abstract methods 3. Upcasting / downcasting

Object Oriented Programming. Java-Lecture 11 Polymorphism

Inheritance, and Polymorphism.

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 17: Types and Type-Checking 25 Feb 08

ITI Introduction to Computing II

CSE 143 Lecture 20. Circle

Introduction to OOP with Java. Instructor: AbuKhleif, Mohammad Noor Sep 2017

CSIS 10B Lab 2 Bags and Stacks

More About Classes CS 1025 Computer Science Fundamentals I Stephen M. Watt University of Western Ontario

Lecture 5: Inheritance

Introduction to Computing II (ITI 1121) Final Examination

ITI Introduction to Computing II

CS-140 Fall 2018 Test 2 Version A Nov. 12, Name:

Outline. Inheritance. Abstract Classes Interfaces. Class Extension Overriding Methods Inheritance and Constructors Polymorphism.

COMP 213 Advanced Object-oriented Programming Lecture 8 The Queue ADT (cont.)

Inheritance (Deitel chapter 9)

CS1150 Principles of Computer Science Objects and Classes

double d0, d1, d2, d3; double * dp = new double[4]; double da[4];

CS-202 Introduction to Object Oriented Programming

CH. 2 OBJECT-ORIENTED PROGRAMMING

INTERFACES IN JAVA. Prof. Chris Jermaine

Software Paradigms (Lesson 3) Object-Oriented Paradigm (2)

Topic 5: Abstract Classes & Interfaces

1B1b Inheritance. Inheritance. Agenda. Subclass and Superclass. Superclass. Generalisation & Specialisation. Shapes and Squares. 1B1b Lecture Slides

CISC 3115 TY3. C09a: Inheritance. Hui Chen Department of Computer & Information Science CUNY Brooklyn College. 9/20/2018 CUNY Brooklyn College

Advanced Programming - JAVA Lecture 4 OOP Concepts in JAVA PART II

CSCI-142 Exam 1 Review September 25, 2016 Presented by the RIT Computer Science Community

Interfaces and itera-on. CSCI 136: Fundamentals of Computer Science II Keith Vertanen

Inheritance Motivation

Slide 1 CS 170 Java Programming 1

CSE 8B Programming Assignments Spring Programming: You will have 5 files all should be located in a dir. named PA3:

Announcements/Follow-ups

Generics. IRS W-9 Form

CS/ENGRD 2110 FALL Lecture 7: Interfaces and Abstract Classes

COMP 250. Lecture 29. interfaces. Nov. 18, 2016

MIT AITI Lecture 18 Collections - Part 1

Industrial Programming

What is an Object. Industrial Programming. What is a Class (cont'd) What is a Class. Lecture 4: C# Objects & Classes

Data Abstraction. Hwansoo Han

Day 4. COMP1006/1406 Summer M. Jason Hinek Carleton University

Introduction to Software Testing Chapter 2.4 Graph Coverage for Design Elements Paul Ammann & Jeff Offutt

Programming Languages and Techniques (CIS120)

Principles of Software Construction: Objects, Design, and Concurrency. Objects (continued) toad. Spring J Aldrich and W Scherlis

Inheritance and Interfaces

Programming in C++ Prof. Partha Pratim Das Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

Object Oriented Programming: In this course we began an introduction to programming from an object-oriented approach.

INTERFACES IN JAVA. Prof. Chris Jermaine

Notes on access restrictions

CS18000: Programming I

Graphical Interface and Application (I3305) Semester: 1 Academic Year: 2017/2018 Dr Antoun Yaacoub

Java Fundamentals (II)

Introduction to C++ Introduction to C++ Dr Alex Martin 2013 Slide 1

Page 1 of 16. Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

ITI Introduction to Computing II

PROGRAMMING LANGUAGE 2

Inheritance. Transitivity

25. Interfaces. Java. Summer 2008 Instructor: Dr. Masoud Yaghini

Reusing Classes. Hendrik Speleers

OBJECT ORİENTATİON ENCAPSULATİON

Collections, Maps and Generics

An introduction to Java II

INHERITANCE. Spring 2019

Chapter 10 Classes Continued. Fundamentals of Java

1.00 Lecture 14. Exercise: Plants

Lesson 10A OOP Fundamentals. By John B. Owen All rights reserved 2011, revised 2014

Advanced Placement Computer Science. Inheritance and Polymorphism

Transcription:

Overview ITI 1121. Introduction to Computing II Rafael Falcon and Marcel Turcotte (with contributions from R. Holte) Electrical Engineering and Computer Science University of Ottawa Interface Abstract data types Version of February 1, 2012 Please don t print these lecture notes unless you really need to! Interface 1 Problem 1 In the general context of object-oriented programming (including but not restricted to Java), the interface designates the list of public methods and variables of a class. For example, consider a Time class having three public methods: gethours, getminutes and getseconds, and no other public methods or variables. Then, the interface of the Time class is gethours, getminutes and getseconds. Through a series of problems, we will discover the need for a new concept, called interface. Problem 1: write a (polymorphic) method that sorts an array of objects. There are a variety of sorting algorithms, including bubble sort, selection sort and quick sort. What do all these algorithms have in common? (do not answer now) To make this example concise, the size of the input array will be two (2). Therefore, sorting the array will be simple: if the value of the first element is smaller than the value of the second element, there is nothing to do, otherwise exchange the content of the two elements. An algorithm to solve the general case will also be presented. Specifically, here is an implementation that sorts an array of two integers. public static void sort2( int[] a ) { if ( a[ 0 ] > a[ 1 ] ) { int tmp = a[ 0 ]; a[ 0 ] = a[ 1 ]; a[ 1 ] = tmp; What are the necessary changes so that the method can be used to sort an array of Time objects? 1) Changing the type of the variables (input parameters and local variables) as well as 2) replacing the comparison operator by a method call. public static void sort2( Time[] a ) { if ( a[ 0 ].after( a[ 1 ] ) ) { Time tmp = a[ 0 ]; a[ 0 ] = a[ 1 ]; a[ 1 ] = tmp; What would be the necessary changes so that the method can be used to sort an array of Shapes? 1) Changing the type of the variables (parameter and local variable) and replacing the method that is used to compare two values. public static void sort2( Shape[] a ) { if ( a[ 0 ].compareto( a[ 1 ] ) > 0 ) { Shape tmp = a[ 0 ]; a[ 0 ] = a[ 1 ]; a[ 1 ] = tmp; What do these algorithms have in common?

What are the requirements/types/operations? To sort an array of objects, one simply needs a way to compare two objects. Sorting an array of objects is a task that is likely to occur in a variety of contexts: an array of student objects, bank accounts, transactions, etc. Therefore a general, polymorphic, method would be useful. static void sort2( [] as) { if ( as[ 0 ]. ( as[ 1 ] ) > 0 ) { tmp; tmp = as[ 0 ]; as[ 0 ] = as[ 1 ]; as[ 1 ] = tmp; 1. Needs a method for comparing two objects; 2. The name of the method must be the same for all the classes who need to use the sort method; 3. The particular implementation depends on the type of the objects that are stored in the array. This solution will be discarded later. However, we are first trying to solve this problem with the tools that we have: object-oriented programming and inheritance. 1 class { public 1 int compareto( 2 obj); What is missing? Element 1 is the abstract keyword. Indeed, the implementation of the compareto() method depends on the particular type of object. abstract class { public abstract int compareto( 2 other ); What is missing? Finding the second element is slightly more complex. Let s consider the implementation of the sort2() method first. public class Array { public static void sort2( [] as ) { ---------- if ( as[ 0 ].compareto( as[ 1 ] ) > 0 ) { --------- tmp; ---------- tmp = as[ 0 ]; as[ 0 ] = as[ 1 ]; as[ 1 ] = tmp; However, using Object will make the method slightly more general. abstract class { public abstract int compareto( Object obj ); If your answer was, it was a good answer.

+compareto(o:object): int Our first solution requires creating an abstract class called that contains only one method, which is abstract; the method is called compareto(). Any class who needs to use the (polymorphic) sort2() method must be a sub-class of (and therefore must implement the compareto() method). For instance, the Time and Shape classes would be modified so that both would be subclasses of. Shape x: double = 0 y: double = 0 +getx(): double +gety(): double +moveto(x:double,y:double): void Rectangle Circle width: double = 0 radius: double = 0 height: double = 0 +sale(): void +getradius(): double +getwidth(): double +getheight(): double +flip(): void Time hours: int minutes: int seconds: int +gethours(): int +getminutes(): int +getseconds(): int +equals(t:time): boolean +increase(): void normalize(): void For the Time class, one would write: public class Time extends { public int compareto( Time other ) { int result; if ( timeinseconds < other.timeinseconds ) { result = -1; else if ( timeinseconds == other.timeinseconds ) { result = 0; else { result = 1; return result; Hum, there is a compile-time error. What is it? The problem is caused by the following signature: public int compareto(object other). What is the problem? What would be the error message? Time is not abstract and does not override abstract method compareto(java.lang.object) in For the Time class: public class Time extends { public int compareto( Object other ) { int result; if ( timeinseconds < other.timeinseconds ) { result = -1; else if ( timeinseconds == other.timeinseconds ) { result = 0; else { result = 1; return result; Warning! It would be tempting to write public int compareto( Time obj ) ; you must resist! Grrr, the compilation of this class still produces a compile-time error, which one? Solution? public class Time extends { public int compareto( Object other ) { int result; if ( timeinseconds < other.timeinseconds ) { result = -1; else if ( timeinseconds == other.timeinseconds ) { result = 0; else { result = 1; return result; The parameter is of Object type, the timeinseconds instance variable is not defined in the Object class. Solution: public class Time extends { public int compareto( Object obj ) { Time other = (Time) obj; int result; if ( timeinseconds < other.timeinseconds ) { result = -1; else if ( timeinseconds == other.timeinseconds ) { result = 0; else { result = 1; return result; Similarly, the Shape class needs to be changed so that 1) it becomes a subclass of and 2) it implements the compareto() method so that the Array.sort2() method can be used to sort arrays of Shapes. public class Shape extends {. public int compareto( Object o ) { Shape other = (Shape) o; int result; if ( area() < other.area() ) result = -1; else if ( area() == other.area() ) result = 0; else result = 1; return result;

Test: Here is a method that can be used to sort any array of (2) objects as long as the class of the objects is a subclass of, i.e. they have an implementation for compareto(). public static void sort2( [] a ) { if ( a[ 0 ].compareto( a[ 1 ] ) > 0 ) { tmp = a[ 0 ]; a[ 0 ] = a[ 1 ]; a[ 1 ] = tmp; Time[] times = new Time[ 2 ]; Times[ 0 ] = new Time( ); Times[ 1 ] = new Time( ); Array.sort2( times ); Shape[] shapes = new Shape[ 2 ]; shapes[ 0 ] = new Circle(); shapes[ 1 ] = new Rectangle(); Array.sort2( shapes ); Problem solved! For now... Problem 2: Display elements Problem 2: Display elements Problem 2: write a (polymorphic) method that displays all the elements of an array (arrays of shapes, buttons, balloons, etc.). class Graphics { public static void displayall( [] as ) { for ( int i=0; i<as.length; i++ ) { as[ i ].display(); public class Displayable { public void display(); What is missing? What should be the type of the elements of this array? Problem 2: Display elements Displayable public abstract class Displayable { public abstract void display(); Shape x: double = 0 y: double = 0 +getx(): double +gety(): double +moveto(x:double,y:double): void Button Rectangle width: double = 0 height: double = 0 +getwidth(): double +getheight(): double +flip(): void Circle radius: double = 0 +sale(): void +getradius(): double Usage: Any class who needs to use the Graphics.displayAll(Displayable[] as) method must: 1. Be a subclass of Displayable; 2. Implement the display() method. Problem 3: Shape should be both and Displayable! What solution do you propose? Problem solved! For now...

+compareto(o:object): int One possible solution would be to make Displayable a subclass of therefore forcing any of its subclasses to implement both display() and compareto(). What do you think? Displayable Shape x: double = 0 y: double = 0 +getx(): double +gety(): double +moveto(x:double,y:double): void Button Time hours: int minutes: int seconds: int +gethours(): int +getminutes(): int +getseconds(): int +equals(t:time): boolean +increase(): void normalize(): void Rectangle width: double = 0 height: double = 0 +getwidth(): double +getheight(): double +flip(): void Circle radius: double = 0 +sale(): void +getradius(): double Displayable The problem with this hierarchy is that Button also has to be and Displayable. +compareto(o:object): int Button Maybe it does not make much sense for a button to be! What do we do? Let s change the hierarchy. Shape x: double = 0 y: double = 0 +getx(): double +gety(): double +moveto(x:double,y:double): void Time hours: int minutes: int seconds: int +gethours(): int +getminutes(): int +getseconds(): int +equals(t:time): boolean +increase(): void normalize(): void Rectangle width: double = 0 height: double = 0 +getwidth(): double +getheight(): double +flip(): void Circle radius: double = 0 +sale(): void +getradius(): double The problem with this new hierarchy is that Time is now Displayable as well as. It doesn t make much sense for the Time class to implement the display() method. It s not possible to organize these classes coherently using single inheritance. It seems what we need is multiple inheritance? Interfaces The problem is that Java does not support multiple-inheritance. class Shape extends, Displayable { Dead-end. Java has an alternative concept to solve particularly this kind of problems. It s called an interface and it implements the relationship can be seen as (as opposed to is a, that class inheritance implements).

Interfaces Interfaces An interface definition resembles a class definition. It consists of the interface keyword, instead of class, followed by the name of the interface. public interface { public abstract int compareto( Object o ); The definition is located in a file that has the same name as the interface and a.java extension. The file is compiled, as a class would be, to produce a.class file. Interfaces The interface is actually part of the standard Java library! An interface contains: Constants; Abstract method definitions. Like an abstract class, it s not possible to create an instance of an interface. Unlike an abstract class, the interface cannot contain concrete method implementations. public interface { public abstract int compareto( Object o ); This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class s natural ordering, and the class s compareto() method is referred to as its natural comparison method. The compareto() method compares this object with the specified object for order. It returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. We have defined an abstract data type (). Now it needs an implementation. public abstract class Shape implements { New keyword: implements. The Shape class implements the interface. So!? The Shape class must provide an implementation for the int compareto( Object o ) method. What have we gained? A class can implement more than one interface. public abstract class Shape implements, Displayable { It simply means that Shape must implement both compareto() and display() methods. A class that implements an interface must implement ALL the methods listed in the interface. What is it useful for? What is it useful for? a; b; a = ; b = ; // valid? // valid? if ( a.compareto( b ) > 0 ) { An interface can be used as the type of a reference variable. o; What can you store in it? Is this a valid statement? o = new ();

What is it useful for? What is it useful for? No. The following statement is not valid. o = new (); Those two statements are valid! o; Circle c = new Circle( 0, 0, 1 ); o = c; o.getx(); // not valid c.getx(); // valid The reference of an object that implements the interface can be stored in a reference of this type. What is it useful for? Usage The String class implements the interface. Pitfall. Are these statements valid? o; o = new Circle( 0, 0, 1 ); String s = o.tostring(); Yes they are. A reference always designates an object and all the objects have the characteristics of the Object class. The Arrays class of the Java standard library has a sort() method that sorts arrays of objects. import java.util.arrays; public class Test { public static void main( String[] args ) { Arrays.sort( args ); for ( int i=0; i<args.length; i++ ) System.out.println( args[i] ); Usage Usage > java Test using interfaces in Java Java in interfaces using Similarly, if the Time class definition is modified so that it implements the interface, i.e. its declaration is modified as follows: public class Time implements { and accordingly it must implement the compareto() method, then the same sorting algorithm can be used to sort a Time array. Time[] ts = new Time[ 100 ]; Arrays.sort( ts ); Usage public class SortAlgorithms { public static void selectionsort( a[] ) { for ( int i = 0; i < a.length; i++ ) { int min = i; // Find the smallest element in the unsorted // region of the array. for ( int j = i+1; j < a.length; j++ ) if ( a[ j ].compareto( a[ min ] ) < 0 ) min = j; // Swap the smallest unsorted element with // the element found a position i. tmp = a[ min ]; a[ min ] = a[ i ]; a[ i ] = tmp; See www.cs.ubc.ca/spider/harrison/java Implementing Multiple Interfaces public class A implements B, C, D { interface B { public abstract void b1(); public abstract void b2(); interface C { public abstract void c1(); interface D { public abstract void d1(); public abstract void d2(); public abstract void d3(); Java does not allow multiple inheritance but it does allow a class to implement multiple interfaces.

Interfaces and the type system Interfaces and the type system An interface is a conceptual tool for the programmer to design software. What does it explicitly mean to the compiler? Let s consider the interface, the SortAlgorithms class (which declares variables of type), and the Shape class (which implements ). These classes represent the three players for these equations: the interface, an implementation and a polymorphic method. An interface defines a contract. () A class that declares variables of an interface type has to use those variables consistently w.r.t. the declaration of the interface, i.e. it can only use the methods that are declared in the interface. (SortAlgorithms) A class that implements an interface has to provide an implementation for every method listed in the interface. (Shape) A class that declares variables of an interface type, such as SortAlgorithms, can be compiled in the absence of an actual implementation; specifically to compile SortAlgorithms all that s needed is SortAlgorithms.java and the interface declaration (here, this interface exists in Java s own library). An actual implementation for the interface is not required. Interfaces and the type system Interfaces vs Abstract Classes A class that declares variables of an interface type has to use those variables consistently w.r.t. the declaration of the interface, i.e. it can only use the methods that are declared in the interface. (SortAlgorithms) A class that implements an interface has to provide an implementation for every method listed in the interface. (Shape) A class that declares variables of an interface type, such as SortAlgorithms, can be compiled in the absence of an actual implementation; specifically to compile SortAlgorithms all that s needed is SortAlgorithms.java and the interface declaration (here, this interface exists in Java s own library). An actual implementation for the interface is not required. The interface resembles an abstract class. However, there are only abstract methods in an interface. An abstract class may also have concrete method implementations. Interfaces vs Abstract Classes Interfaces vs Abstract Classes Interfaces and abstract classes are two ways to define a data type with an abstract contract (i.e. without implementation). Which one to use? An abstract class that contains only abstract methods should probably be defined as an interface; If the problem needs multiple inheritance then use interfaces; To mix concrete and abstract methods, you need to use an abstract class; An interface defines the relationship can be seen as ; Inheritance defines the relationship is a. Property Concrete Abstract Interface Instances can be created Yes No No Instance variables and methods Yes Yes No Constants Yes Yes Yes Can declare abstract methods No Yes Yes Interfaces Interfaces and Abstract Data Types An interface is useful when there are several possible implementations for a given problem/data structure. Take the example of the Time class and its two implementations (hh:mm:ss and totalseconds). Defining an interface that contains all the necessary and sufficient methods for the time concept would allow us to create programs that would work with either of the two implementations. An abstract data type defines the valid operations without providing an implementation. An interface is therefore a formalism that can be used to express abstract data types in Java.

Generic and Parameterized Types Defining a generic type A generic type is a reference type that has one or more type parameters. A generic type is an interface or class that has one or more type parameters. public interface <T> { public int compareto( T other ); Creating a parameterized type Generic methods public class Employee implements <Employee> { private int uid; public Employee( int uid ) { this.uid = uid; public int getuid() { return uid; Besides generic types (classes with formal type parameters), methods can also have type parameters. public void setuid( int value ) { uid = value; public int compareto( Employee other ) { return uid - other.uid; Generic methods Using generic methods public class Utils { public static < T extends <T> > T max( T a, T b ) { if ( a.compareto( b ) > 0 ) { return a; else { return b; 1) Herein, the Utils class has no type parameter, 2) max() is a class method, 3) max() has a type parameter, 4) the type declaration is local to the max() method. Invoking a generic method requires no additional syntactical construction. The type argument is inferred automatically. Integer i1, i2, imax; i1 = new Integer( 1 ); i2 = new Integer( 10 ); imax = Utils.max( i1, i2 ); System.out.println( "imax = " + imax ); Here, the compiler infers the Integer type argument. Using generic methods Using generic methods String s1, s2, smax; s1 = new String( "alpha" ); s2 = new String( "bravo" ); smax = Utils.max( s1, s2 ); System.out.println( "smax = " + smax ); The type may also be supplied explicitly: imax = Utils.<Integer>max( i1, i2 ); smax = Utils.<String>max( s1, s2 ); This is necessary whenever the type system cannot infer a type that is specific enough. Here, the compiler infers the String type argument.

Data Types Abstract Data Types As discussed in the first lecture, a data type is characterized by: a set of values; a set of operations; a data representation. These characteristics are necessary for the compiler to verify the validity of a program which operations are valid for a given data. These characteristics are also necessary for the compiler to be able to create a representation for the data in memory; how much memory to allocate. An abstract data type (ADT) is characterized by: a set of values; a set of operations. The data representation is not part of the specification of an ADT. A concrete data type must have a representation, but the ADT makes a distinction between how it is used and how it is implemented, which is private. Abstract Data Types (cont d) ADT specification in Java The design of the Time classes followed this principle. Both implementations (hh:mm:ss and totalseconds) can be characterized by the following behaviour: Allow representing a time value with a precision of one second for a period of 24 hours. Both classes have the list of arguments for their respective constructor. Both classes implement: gethours(), getminutes(), getseconds(), increase(), before( t ), after( t ) and equals( t ), where t is an instance of the Time class. The ADT concept is independent of any programming language. It s a discipline to avoid tight coupling of the classes. In Java, whenever a class is created that has no public variables, such as Time1 and Time2, it represents an ADT. This idea is so important that Java has a specific concept to express ADTs, an interface. An interface is a purely abstract contract. ADT specification in Java ADT specification in Java public interface Stack { public abstract boolean isempty(); public abstract Object peek(); public abstract Object pop(); public abstract Object push( Object item ); public interface Queue { public abstract boolean isempty(); public abstract Object dequeue(); public abstract Object enqueue( Object item ); public interface List { public abstract void add( int index, Object o ); public abstract boolean add( Object o ); public abstract boolean contains( Object o ); public abstract Object get( int index ); public abstract int indexof( Object o ); public abstract boolean isempty(); public abstract Object remove( int i ); public abstract int size(); References I E. B. Koffman and Wolfgang P. A. T. Data Structures: Abstraction and Design Using Java. John Wiley & Sons, 2e edition, 2010. P. Sestoft. Java Precisely. The MIT Press, second edition edition, August 2005. D. J. Barnes and M. Kölling. Objects First with Java: A Practical Introduction Using BlueJ. Prentice Hall, 4e edition, 2009. Maurice Naftalin and Philip Wadler. Java Generics and Collections. O Reilly, 2007. Please don t print these lecture notes unless you really need to!