Kapitel 22. Indre klasser

Indhold:

Kapitlet er en forudsætning for at forstå den måde, mange værktøjer laver kode til at håndtere hændelser.

Forudsætter Kapitel 12, Interfaces, afsnittet om final i Kapitel 21, Avancerede klasser (og Kapitel 13, Hændelser og Kapitel 17, Flertrådet programmering for at forstå nogle af eksemplerne).

Indre klasser er mindre "hjælpeklasser" defineret inde i en anden klasse. Dette kapitel handler om de forskellige måder at definere indre klasser på, og de forhold, der her gør sig gældende.

Siden Java version 1.1 har der eksisteret 3 slags indre klasser:

Der er flere fordele ved at benytte indre klasser (visse undtagelser bliver forklaret sidst i kapitlet):

22.1. Almindelige indre klasser

En almindelig indre klasse er en klasse, der erklæres på linje med objektvariabler og metoder:

public class YdreKlasse
{
  class IndreKlasse
  {
  }
}

Programkoden i den indre klasse kan anvende alle den ydre klasses variabler og metoder - også de private. Den indre klasse er knyttet til et objekt af den ydre klasse.

22.1.1. Eksempel - Linjetegning

Man benytter ofte indre klasser i forbindelse med at lytte efter hændelser. Her kommer Linjetegning-eksemplet fra Kapitel 11 igen, men hvor vi lader en indre klasse lytte efter museklik.

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class LinjetegningIndre extends Applet
{
  // Selv private variabler er synlig for den indre klasse
  private Point trykpunkt = null;
  private Point slippunkt = null;

  public void init()
  {
    Linjelytter lytter = new Linjelytter();
    this.addMouseListener(lytter);
  }

  // En indre klasse
  class Linjelytter implements MouseListener
  {
    public void mousePressed (MouseEvent event)
    {
      trykpunkt = event.getPoint();           // sæt variablen i det ydre objekt
    }

    public void mouseReleased (MouseEvent event)
    {
      slippunkt = event.getPoint();
      repaint();                              // kald det ydre objekts metode
    }

    public void mouseClicked (MouseEvent event) {} // kræves af MouseListener
    public void mouseEntered (MouseEvent event) {} // kræves af MouseListener
    public void mouseExited (MouseEvent event) {}  // kræves af MouseListener
  }
  // slut på indre klasse

  // en metode i den ydre klasse
  public void paint (Graphics g)
  {
    if (trykpunkt != null && slippunkt != null)
      g.drawLine (trykpunkt.x, trykpunkt.y, slippunkt.x, slippunkt.y);
  }
}

Læg mærke til, at den indre klasse uden videre har adgang til den ydre klasses variabler og metoder.