Title: Object Oriented Programming
1Object Oriented Programming
- Lecture 2
- Inheritance, Polymorphism, First Design pattern,
Interface, Exceptions, Enumeration Types - www2.hh.se/staff/jebe/oop2006/
2Abstract Data types
- We have seen that we can define new data types by
creating new classes - A Class implements a Contractual Interface (the
public parts of the class) - A Class has a state representation (variables
should preferrably be private) - The implementation of the class
- Implement the methods (accessors,mutators)
- Implement methods for testing (repOk())
3The Rational Class
- Desired functionality? (The contractual
interface, ie the methods required) - Constructors (establish the invariant)
- Rational(), Rational(int num), Rational(int
num,int den) - Arithmetic operations (methods)
- Plus(Rational a, Rational b)
- Minus(Rational a, Rational b)
- Times(Rational a, Rational b)
- Div(Rational a, Rational b)
- Other methods
- toString(), equals(Object x), compareTo(Object
x), repOk()
4The Rational Class
- The implementation
- Class Rational
- private int num
- private int den
- public Rational()
- this(0,1)
-
- public Rational(int num, int den)
- if(den 0) throw ArithmeticException(Zero
denominator) - else
- this.num denlt0 ? num,num
- this.den Math.abs(den)
- simplify()
-
-
-
State representation, hidden (encapsulated)
Make sure the invariant is established!!
5Extending Rationals to Complex Numbers
- Complex numbers is an extension of Rational
numbers - The real and imaginary components are Rationals!
(1/2 j1/2) - Complex arithmetic can be formed as a composite
of Rational arithmetic (1/2 j1/2) (1/2 j1/2)
(1/1 j1/1) - The idea We let Complex inherit Rational
properties by extending the Rational Class
6Extending to Complex Numbers
- public class Complex extends Rational
- //State representation
- private Rational real private Rational imag
-
- / Constructor for injecting Rational Complex
vector components / - public Complex(Rational re, Rational im)
- real re
- imag im
-
- / Arithmetic Plus for Complex valued numbers
/ - public Complex plus(Complex c1, Complex c2)
- return new Complex(plus(this.real,c.real()),plus
(this.im,c.im())) -
- ...
- ...
Plus in Complex overloads the inherited plus in
Class Rational
7Recapitulation
- When we create software models of real world
systems, we use Classes to define - Abstract Data Types (immutable, variables for
representing the abstract data) - Objects (mutable, instance variables that hold a
state, methods implements the algorithms) - In Java - Integer, Float, Double (Wrapper
classes) are example of immutables - Wrapper Classes are used to wrap primitive
datatypes into objects when needed
8Recapitulation
- In both cases important terms are
- Hiding the implementation (encapsulation)
- Prevents misuse
- Programming to an interface (Abstraction)
- Modularity, Extendability, Reusability...
- Establishing and preserving the invariant
- Objects must be in a legal state after creation
and after manipulation by a method - The equals method
- To compare State equality of objects
9Interfaces
- Interface is a special type of Class
- An Interface declares only abstract methods that
must be defined in a class - Thus, an interface has no implemented methods
itself methods are defined in the implementing
class - Only constants are allowed to be specified
- Interfaces can inherit from other Interfaces
- Super Interfaces and Sub Interfaces
10Interface Example
- Interface Drawable
- public int aValue 1
- public void draw(Graphics g)
- public int getWidth()
- public int getHeight()
-
- Public Class Square implements Drawable
- int xSide,ySide,posX,posY
- public void draw() g.drawRect(posX,posY,xSide,y
Side) - public int getWidth() return ySide
- public int getHeight() return xSide
-
Constants allowed
11Abstract Classes
- An abstract class has at least one method
implemented - Other methods can be abstract
- Thus, and abstract class is a class with partial
implementation - Like with an Interface, abstract methods must be
implemented by the class that extends the
abstract class
12Abstract Class Example
- public abstract class Shape
-
- protected Point location
-
- protected Shape(Point loc) location loc
- public void move(int dx,int
dy)location.move(dx,dy) -
- public abstract void draw()
-
- Public Class Square extends Drawable
- int xSide,ySide
- public Square(int x,int y) super(new
Point(x,y)) - public void draw() g.drawRect((int)location.get
X(), (int)location.getY(), xSide, ySide) - public int getWidth() return ySide
- public int getHeight() return xSide
13Polymorphism
- The term polymorphic origins from Greek
- Poly many
- Morphos forms/shapes
- Roughly, polymorphic objects are objects with
features of a similar kind - That is - objects that shares an interface but
has different algorithms
14Example - Polymorphic shapes in a drawing program
Common functionality for shapes...
Shape
Circle
Square
Rectangle
...how to draw a shape is defined in each
specific object of shape type
15Conversion between types
- Conversion of a subtype to a supertype is called
widening - Widening is always allowed to do
- Conversion of a supertype to a subtype is called
narrowing (downcasting) - Allowed at compile time, not always safe
- Dynamic binding
- The specific method is bound at runtime
- In the shape example, method draw is bound to a
specific shape type during run time - Let us see an example from an old exam...
16A few things about Throwables Exceptions
- Exceptions are unexpected or faulty conditions in
a program - When a fault occurs, an exception can be thrown
and the normal program flow is interrupted - Three kinds of Throwables
- Error (severe!)
- RuntimeException (for example array out of
bounds) - Exception (User defined exception should extend
this)
17Exceptions
Serious Fault!
OutOfMemoryError
Thrown By JVM!
Error
ArithmeticException
AssertionError
Throwable
ClassCastException
RuntimeException
IndexOutOfBoundsException
NullpointerException
Exception
Io-Exception
Any program!
18Catching Exceptions
- Exceptions are caught handled with a
try-catch-clause - Try
- a bi
- catch (ArrayOutOfBoundsException e)
- exception handling code here...
- finally...clean up before leaving (...finally
is not necessary) - User defined exceptions must extend class
Exception - MyVeryOwnException extends Exception
- super(A terrible error has occured!)
19Throwing Exceptions
- Most Exceptions are thrown by the JVM
- But Exceptions can also be thrown anywhere in a
program - Public int example(void) throws MyException
- method code...
- throw new MyException()
-
- Method calls to methods that has a throws
statement must be encapsulated with try-catch
clause - The exception should be handled in catch or be
thrown to the object that was calling the method.
20A new type Pen Mutable Object
- What functionality do we want when using a
pen(interface)? - Constructor
- pen()
- Methods for changing the state of a pen(instance
methods) - void lift()
- void push()
- void move(double d)
- void turn(double alpha)
- Methods for assigning a drawing area to our pen
- void setPaper(Paper p)
21Pen is a mutable object
- Pen thePen
- ...
- public void recLine(int n, double length)
- if (n0)
- thePen.move(length)
- else
- int m n-1
- double shorter length/3.0
- double alpha Math.PI/3
- recLine(m,shorter)
- thePen.turn(-alpha)
- recLine(m,shorter)
- thePen.turn(2alpha)
- recLine(m,shorter)
- thePen.turn(-alpha)
- recLine(m,shorter)
-
-
Modifies the state of the pen itself! Pen is
mutable
22Lets take a look atmove(double d)
- public void move(double d)
- double oldx x
- double oldy y
- x Math.min(xdMath.cos(alpha),paper.width())
- y Math.min(ydMath.sin(alpha),paper.height())
- if(down)
- paper.drawLine((int)oldx,(int)oldy,(int)x,(int)y
)
23Our first design patternObserver-Observable
- Now, lets examine the properties of a Paper.
width
A paper is a Canvas that has height and width
dimensions in pixels. It also has a paint method
to show the lines drawn by the Pen.
height
Canvas is an AWT component
The view of a paper!
24Observer ObservableSeparation of model and view
- Paper (Model)
- Add a new line
- Width
- Height
- Add Observer
- Register changes
- Notify the Observers
- Paperview (View)
- Override the paint method so that it paints the
state of the model (lines) - Define the method update so a change in the model
will be reflected in the view
25Extending Observable
- The Observable class implements methods for
keeping and interacting with a set of Observers - Adding Observers to the Set
- Notifying Observers of changes by calling the
Observers update method - By extending Paper with Observable we will have
access to all necessary methods - We only need to know which are the Observers
26The Paper Class Observable
- public class Paper extends Observable
- private Vector lines
- private int width, height
-
- public Paper(int width, int height)
- this.width width
- this.height height
- lines new Vector()
-
- public void drawLine(int a, int b, int c, int
d) - lines.add(new Line(a,b,c,d))
- setChanged()
- notifyObservers()
-
- ...
We have added a line...
Register the change in Observer!
Notify the Observers!
27The PaperView Class
- public class PaperView extends Canvas implements
Observer -
- private Paper paperModel
-
- public PaperView(Paper p)
- paperModel p
- paperModel.addObserver(this)
-
-
- public void update(Observable o, Object arg)
- tryThread.sleep(200)catch(Exception
e) - repaint()
-
-
- public void paint(Graphics g)
- Iterator iter paperModel.iterator()
- while(iter.hasNext())
- Line line (Line)iter.next()
Called when notifying observers!
How we paint the lines!
28The Java I/O Framework
- The I/O framework is designed to be flexible and
easy to configure - Java has two main types of I/O
- Stream IO
- Supports reading/writing sequentially
- A stream can only be open for read or write, not
both - Random Access I/O
- Reading and writing at any position in a file
- File I/O can be open both for read/write
- We focus at Stream I/O
- Two kinds of streams bytes or charachter
29I/O Byte Streams
- The basic I/O streams are
- Input Stream
- read() - reads byte
- read(byte a) - reads byte array
- read(byte a, int off,
- int len) - reads part of byte array
- skip(long n) - skips over n bytes
- close() - closes the stream
- OutputStream
- write(b) - writes byte
- write(byte a) - writes byte array
- write(byte a, int off,
- int len) - writes part of byte array
- close() - closes the stream
30Reading from files
- FileInputStream/FileOutputstream are sub classes
of Input/OutputStream byte streams (overloads the
methods) - But byte streams are hardly convenient to use
directly, requires low-level manipulation - Bitmasking and conversion
- This kind of low-level is rarely necessary
- Most data are represented by Objects
31Buffered Streams
- BufferedInputStream and BufferedOutputStream
(extends java.io.FilterInputStream) - Reads data via an internal buffer
- BufferedReader and BufferedWriter (extends
java.io.Reader) - Abstract streams for reading String/Charachter
data - Can be used to read entire Strings
32Object serialization
- Java supports Object serialization
- Objects can be passed as arguments to a stream
- The objects are transparently serialized to a
sequence of bytes - Objects must implement Serializable interface
(java.io.Serializable) - ObjectInputStream and ObjectOutPutStream
- FileInputStream/FileOutPutStream as arguments for
file access
33Enumeration Types
- Enumeration types
- A finite set of distinct values
- Example of Enumerated types
- Date MonTueWedThuFriSatsun
- Direction NorthEastSouthWest
- We can use the Enumerated Types like any other
type in our program - Ex. Date d Monday
- The Enumerated types should be typesafe
34Enumerated types
- Some languages like C/C support enumerated
types... - In C or C, we would write
- enum Date Mon,Tue,Wed,Thu,Fri,Sat,Sun
- Date day1 Tue
- Date day2 Fri
- If(day1 day2)....
- Untill Java 1.5 was released, Java didnt support
typesafe enumerated types - Before 1.5 a common (but bad) solution Treat
enumeration types as static int constants.
35A Type safe Idiom
- Type-Safe Enumeration Idiom
- Each value will be distinct (unique)
- A printable, descriptive name rather that just an
Integer number - Lets look at two examples
- An unordered Type-Safe Enumeration
- An ordered Type-Safe Enumeration
36Typesafe enumeration in Java 1.5
- Public class Card
- public enum Rank Deuce, Three, Four, Five,
Six, Seven, Eight, Nine, Ten, Jack, Queen,
King, Ace - public enum Suit Clubs, Diamonds, Hearts,
Spades -
- private final Rank rank
- private final Suit suit
- private Card(Rank r, Suit s)
- rank r suit s
-
- public toString()
37So far in the course...
- We have defined
- Classes and Objects
- Interface and Abstract classes
- Inheritance and Polymorhpism
- Mutable and Immutable objects
- A First Design pattern
- Exceptions
- Enumeration types
38That was it for today...
- Pen and Paper example as an exercise next week
- Type safe enum can be read about in JDK 5.0
documentation - Next week
- More design patterns
- The Collections Framework
- Etc...