Indhold:
Indre klasser, herunder lokale klasser og anonyme klasser
Brug af indre klasser og anonyme klasser til at lytte efter hændelser
Brug af anonyme klasser til at oprette bl.a. tråde i en håndevending
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:
(Almindelige) indre klasser
Lokale klasser
Anonyme klasser
Der er flere fordele ved at benytte indre klasser (visse undtagelser bliver forklaret sidst i kapitlet):
Den indre klasse er knyttet til den ydre klasse og kan kun anvendes i denne.Man behøves derfor ikke bekymre sig for sammenhængen med resten af programmet. Det kan give et mere overskueligt program at lægge klasser, der alligevel har meget stærk binding (er meget afhængige af hinanden) inden i hinanden.
Den indre klasse kan arbejde direkte på den ydre klasses variabler og metoder, også de private. Det skyldes, at et objekt af en indre klasse altid hører til et objekt af den ydre klasse.
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.
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.