Title: Inner Classes in Java
1Inner Classes in Java
2Conceptual Structure
package p1 class A1 class
A2 ... class An...package n without
inner classes
package p1 class A1 class A2
class A2_1 class A2_2
... inner classes
3Example
public x z class OC // outer
class private int x 2 public class
IC // inner class int z 4
public int getSum() return
4Why?
- Logical grouping of functionality
- Data hiding
- Yet another encapsulation mechanism
- Linkage to outer class
- Well see about this later
5Simple Motivating Example
public class MyList private Object a
private int size
Say we want to iterate over the elements of this
guy
61st Design
public class MyIterator private MyList
list private int pos MyIterator(MyList
list) this.list list pos 0
public boolean hasNext() return (pos lt
list.size) public Object next()
return list.apos
- Problems
- Need to maintain reference to MyList
- Need to access private data in MyList
72nd Try Using Inner Classes
public class MyList private Object a
private int size public class MyIterator
private int pos MyIterator() pos 0
public boolean hasNext() return
(pos lt size) public Object next()
return apos
8Inner Classes Example
public class OC // outer class private int x
2 public class IC // inner class
int z 4 public int getSum()
return x z
9Mechanics and Syntax
- Class referencing syntax
- OuterClass.InnerClass
- Example
- OC oc new OC( )
- OC.IC ic name of inner class
- ic new OC.IC() doesnt work!
- ic oc.new IC() instantiates inner class - ic
now will "know about" oc, but not vice versa - ic.getSum() yields 6 can access private x in oc!
10Accessing Outer Scope
public class OC outer
class int x 2 public class IC
inner class int x 6
public void getX() inner class
method int x 8
System.out.println( x ) prints
8 System.out.println( this.x )
prints 6 System.out.println( OC.this.x )
prints 2
11Instantiating Inner Class
- Common Technique
- Outer class method returns instance of inner
class - Used by Java Collections Library for Iterators
- Code Example
- public class MyList
- public class IC implements Iterator
- public Iterator iterator()
- return new IC() // creates instance of
IC -
-
- MyList m new MyList()
- Iterator it m.iterator()
12Listeners
- Each event is represented by an object that gives
information about the event and identifies the
event source. - Event sources are typically components.
- Each event source can have multiple
listeners.Conversely, a single listener can
register with multiple event sources.
13Making the Applet the Listener
import java.applet. import java.awt. import
java.awt.event. public class Scribble extends
Applet implements
MouseListener, MouseMotionListener private
int last_x, last_y public void init()
this.addMouseListener(this)
this.addMouseMotionListener(this)
14Mouse Events
public void mousePressed(MouseEvent e)
last_x e.getX() last_y e.getY()
public void mouseDragged(MouseEvent e)
Graphics g this.getGraphics() int x
e.getX(), y e.getY() g.drawLine(last_x,
last_y, x, y) last_x x last_y y
15Need to implement the whole Interface
// The other, unused methods of the
MouseListener interface. public void
mouseReleased(MouseEvent e) public void
mouseClicked(MouseEvent e) public void
mouseEntered(MouseEvent e) public void
mouseExited(MouseEvent e) // The other
method of the MouseMotionListener interface.
public void mouseMoved(MouseEvent e)
16Using Adapters and Inner Classes to Handle Events
- The empty method bodies of the MouseListener
interface from the previous example make the
code harder to read and maintain - Adapter classes are a means around this problem
- An adaptor allows you to override just the
methods for the events of interest
17Adapters and Anonymous Classes
public void init() // Define,
instantiate, and register a MouseListener
object. this.addMouseListener(new
MouseAdapter() public void
mousePressed(MouseEvent e) last_x
e.getX() last_y e.getY()
More Info on Innerclasses )
18References
- http//www.cs.umd.edu/class/spring2005/cmsc132/lec
s/lec27.pdf - http//java.sun.com/docs/books/tutorial/java/javaO
O/nested.html