Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Beispiel: du willst die Klassen "Hose", "Pullover", "Socke", "Unterhose", "Kappe", ... schreiben. Diese Klassen haben ja alle gewisse Gemeinsamkeiten, z.B. die Farbe. Aber sie haben auch unvereinbare Unterschiede, oder stülpst du dir eine Socke über den Kopf, wenn es draussen kalt ist?
In diesem Fall lohnt sich eine Basisklasse, die gewisse Dinge schon kennt, gewisse Dinge vorausahnt, und gewisse Dinge ganz ignoriert:
Code:
public abstract class Kleidung{
// Die Farbe wird bei allen gleich behandelt, die
// können wir hier glich implementieren.
private Color farbe;
public Color getFarbe(){
return farbe;
}
public Color setFarbe( Color color ){
this.color = color;
}
// Wir wissen zwar *dass* ein Kleidungsstück wärmt,
// aber wir haben keine Ahnung *wie* es das macht.
// Deshalb lassen wir die Implementation offen.
public abstract wärmen( Mensch mensch );
}
Oder anders gesagt: eine abstrakte Klasse benötigt man dort, wo man ein Teil einer Klasse implementieren kann, und den Resten zumindest vorgeben.
Sehr beliebt sind abstrakte Klassen um Teile von Interfaces zu implementieren.
Das "AbstractTableModel" ist auch ein gutes Beispiel: all das Zeugs mit dem "TableModelListener" erledigt das "AbstractTableModel", aber es sagt nichts darüber aus, woher es die Daten für eine Tabelle besitzt.
Abstrakte Klassen kannst du selbst nicht direkt instanziieren, wohl aber von ihnen abgeleitete Klassen sofern diese alle abstract Methoden implementieren.
Der Sinn davon ist folgender: Du kannst eine allgemeine Oberklasse definieren, die bereits alle Eigenschaften enthält, die allen abgeleiteten Klassen gemein sein. An Punkten wo Unterschiede vorherrschen sollen, arbeitest du mit abstrakten Methoden. Ein typisches (nicht sehr praxisnahes) Beispiel:
Code:
public abstract class Tier {
int anzahlBeine;
String name;
public int getAnzahlBeine() {return anzahlBeine;}
public String getName() {return name;}
public void setAnzahlBeine(int anzahlBeine) {this.anzahlBeine = anzahlBeine;}
public void setName(String name) {this.name = name;}
public abstract void wieMachtDasTier();
}
Also wie gesagt ein blödes Beispiel eigentlich, aber ich finde es verdeutlich den Sinn. Hier wird davon ausgegangen, dass für jedes Tier interessant ist, wie es heißt und wie viele Beine es hat.
Eine mögliche abgeleitete Klasse wäre nun z.B.
Code:
public class Hahn extends Tier {
public void wieMachtDasTier() {
System.out.println("Kikiriki");
}
public Hahn() {
anzahlBeine = 2;
name = "Hahn";
}
}
Ich hoffe das Prinzip ist nun besser klar geworden. "Tier" ist abstrakt, denn es gibt nicht DAS Tier. Es ist mehr eine Kategorie, einzelne Member dieser Kategorie haben alles gemein was in der oberen abstrakten Klasse definiert wurde, aber unterscheiden sich in den als abstract deklarierten Methoden.