oop with java, david j. barnes abstract and nested classes1 abstract classes: –incomplete abstract...

29
OOP with Java, D avid J. Barnes Abstract and Nested Class es 1 Abstract and Nested Classes • Abstract classes: – Incomplete abstract classes. – Complete abstract classes. – Comparison with interfaces. • Nested Classes: – Static nested classes. – Inner classes.

Upload: phyllis-tamsyn-hensley

Post on 29-Dec-2015

233 views

Category:

Documents


1 download

TRANSCRIPT

OOP with Java, David J. Barnes

Abstract and Nested Classes 1

Abstract and Nested Classes

• Abstract classes:– Incomplete abstract classes.– Complete abstract classes.– Comparison with interfaces.

• Nested Classes:– Static nested classes.– Inner classes.

OOP with Java, David J. Barnes

Abstract and Nested Classes 2

Abstract Classes

• Class has abstract prefix.

• Instances may not be constructed.– Incomplete methods: just a header.– Method has abstract prefix.

• Implicit in interface definitions.

• Objects have no meaningful existence.

• Class elements used by defining sub classes.

OOP with Java, David J. Barnes

Abstract and Nested Classes 3

The Abstract Number Classpublic abstract class Number implements Serializable { public abstract int intValue(); public abstract long longValue(); public abstract double doubleValue(); public abstract float floatValue();

public byte byteValue(){ ... }

public short shortValue(){ ... } ...}

OOP with Java, David J. Barnes

Abstract and Nested Classes 4

Incomplete Abstract Classes

• Define a common interface for multiple sub classes.

• Sub class implementations vary.– Implementation of floatValue, in Number

sub classes, depends on type of attribute.

OOP with Java, David J. Barnes

Abstract and Nested Classes 5

The Double Sub Class

public class Double extends Number { public Double(double value){

this.value = value; } ... // This probably involves loss of information. public float floatValue(){

return (float) doubleValue(); } ... // The value being wrapped. private final double value;}

OOP with Java, David J. Barnes

Abstract and Nested Classes 6

Complete Abstract Classes

• No abstract methods.

• Independent instantiations have no meaning.– ChessPiece super class of Rook, Knight,

etc.– Sub classes provide additional or overriding

functionality.

OOP with Java, David J. Barnes

Abstract and Nested Classes 7

Abstract Class or Interface?

• Interface methods are abstract.

• Interfaces do not have constructors.

• Abstract classes avoid the need to define duplicate method bodies.

• Multiple inheritance.– Extending an abstract class prevents extension

of a second class.

OOP with Java, David J. Barnes

Abstract and Nested Classes 8

Object Cloning

• All classes inherit a clone method.

• Returns an identical copy.– A shallow copy, by default.– A deep copy is often preferable.

• The (empty) Cloneable interface must be implemented.– CloneNotSupportedException

OOP with Java, David J. Barnes

Abstract and Nested Classes 9

A Cloneable Pointclass Point implements Cloneable { ... public Object clone() { try{ // A shallow copy. return super.clone(); } catch(CloneNotSupportedException e){ // This should never happen! throw new Error("Cloning error: "+e); } } ...}

OOP with Java, David J. Barnes

Abstract and Nested Classes 10

Preventing Cloning

• Prevention might be necessary.– A unique attribute - database lock or open file

reference.

• Not sufficient to omit Cloneable.– Sub classes might implement it.

• clone should throw an exception:– CloneNotSupportedException.

OOP with Java, David J. Barnes

Abstract and Nested Classes 11

An Unclonable Classclass NotCloneable { ... // Explicitly prevent sub class cloning. public Object clone() throws CloneNotSupportedException { throw new CloneNotSupportedException("..."); } ...}

OOP with Java, David J. Barnes

Abstract and Nested Classes 12

Nested Classes

• Static Nested Classes (aka Nested Top-Level Classes!?).

• Used to show strong coupling between two classes.– VariableController and HeaterLevelException.

OOP with Java, David J. Barnes

Abstract and Nested Classes 13

class VariableController extends HeaterController { // Class constants for basic temperatures. public static final int DefaultLevel = 16, MinLevel = 5, MaxLevel = 30;

// An illegal temperature level has been set. public static class HeaterLevelException

extends RuntimeException { public HeaterLevelException(String message){ super(message); } }

// The attached heater's current level. public int getLevel(){ ... } ...}

OOP with Java, David J. Barnes

Abstract and Nested Classes 14

Static Nested Class Names

• Nested class has a qualified name.– VariableController.HeaterLevelException

• Separate .class file created.– VariableController$HeaterLevelException.class

• Qualified name used outside the enclosing class.– catch(VariableController.HeaterLevelException e)

OOP with Java, David J. Barnes

Abstract and Nested Classes 15

Inner Classes

• Non-static nested classes.

• Instances only exist within the context of an enclosing object.

• May not have static members.

• May access private members of the enclosing class.

OOP with Java, David J. Barnes

Abstract and Nested Classes 16

Inner Class Roles

• Used to fulfill distinct roles in support of an enclosing object.– Subordinate inner class.– Interpretational inner class.– Local inner class.– Anonymous inner class.

• Very common in supporting GUIs.

OOP with Java, David J. Barnes

Abstract and Nested Classes 17

Subordinate Inner Classes

• Used to break up a single large class.

• Implement subordinate sub-tasks.– E.g., logging a ship's movements.

• Keeps enclosing class less cluttered.

OOP with Java, David J. Barnes

Abstract and Nested Classes 18

public class LoggingShip extends SimpleShip { ... public void move(){

super.move();getLogger().log();

}

protected class ShipLog {protected void log(){

Position p = new Position(getX(),getY()); getLog().add(p);

}

protected LinkedList getLog(){ return positionLog;

}

private LinkedList positionLog = new LinkedList(); } ... private final ShipLog logger = new ShipLog();}

OOP with Java, David J. Barnes

Abstract and Nested Classes 19

Interpretational Inner Classes

• Interpreting an object’s data to outside objects.– Independently of the internal representation.– E.g. Iterator and Enumeration

implementations.

• DataValues - a collection of numbers.

OOP with Java, David J. Barnes

Abstract and Nested Classes 20

public class DataValues { public void add(double d){

getNumbers().add(new Double(d)); }

public double get(int index) throws IndexOutOfBoundsException {

Double d = (Double) getNumbers().get(index);return d.doubleValue();

}

public int numItems(){return getNumbers().size();

} ... protected LinkedList getNumbers(){

return numbers; }

private final LinkedList numbers = new LinkedList();}

OOP with Java, David J. Barnes

Abstract and Nested Classes 21

public class DataValues { public Iterator getPositives(){

return new PositiveSelector(); } protected class PositiveSelector implements Iterator {

public boolean hasNext(){ return nextPosition() >= 0;

}public Object next() throws NoSuchElementException {

int i = nextPosition(); if(i >= 0){

Object o = getNumbers().get(i); setIndex(i+1);

return o; } else{ throw new NoSuchElementException(); }

} ... }}

OOP with Java, David J. Barnes

Abstract and Nested Classes 22

Local Inner Classes

• A class defined within a method.– Permitted within any block.

• Instances may only be created from within that method.– No visibility modifier is used.

• Instances may access the method’s final variables and arguments.

OOP with Java, David J. Barnes

Abstract and Nested Classes 23

public class DataValues { public Iterator selectAbove(final double limit){

class AboveSelector implements Iterator { ... protected int nextPosition(){

int i = getIndex(); final int howMany = numItems(); while(i < howMany){ if(get(i) > limit){

return i; }

i++;}

return -1; }

} return new AboveSelector(); } ...}

OOP with Java, David J. Barnes

Abstract and Nested Classes 24

Anonymous Classes

• Local classes often do not require a name.– When they implement an interface or extend a

super class.– When definition and creation are closely linked.

OOP with Java, David J. Barnes

Abstract and Nested Classes 25

public class DataValues { ... public Iterator selectAbove(final double limit){

return new Iterator() { public boolean hasNext(){

... }

public Object next(){ ... } ...

}; } ...}

OOP with Java, David J. Barnes

Abstract and Nested Classes 26

Anonymous Classes in GUIs.import javax.swing.*;import java.awt.*;import java.awt.event.*;

public class Picture extends JFrame { Container contents = getContentPane(); // Add a button to quit the application. JButton quit = new JButton("Quit"); quit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } }); contents.add(quit,"South"); ...}

OOP with Java, David J. Barnes

Abstract and Nested Classes 27

Inner Classes and thisclass Outer { // 'this' accessible from here. ... class Middle { // 'this' and 'Outer.this' accessible from here. ... class Innermost { // 'this', 'Middle.this' and 'Outer.this' // accessible from here. ... } ... private Innermost i = new Innermost(); } ... private Middle m = new Middle();}

OOP with Java, David J. Barnes

Abstract and Nested Classes 28

Review

• Abstract classes are incomplete and must be sub classed to be useful.

• Abstract classes offer an alternative to interfaces where partial implementation is useful.

• Classes implement cloning by implementing the Cloneable interface.

OOP with Java, David J. Barnes

Abstract and Nested Classes 29

Review (cont.)

• Nested classes may be static nested classes or inner classes.

• Inner class instances always exist within the context of an enclosing object.

• Inner classes have access to the private members of their enclosing class.

• Inner classes are useful for fulfilling a range of roles within their enclosing class.