Eine Klassen schreiben

Klassendeklarationen

Klasse Radio mit Attributen

Implementiere eine Klasse Radio mit folgenden Attributen:

Welche Typen sind sinnvoll?

Lösung

Ein Haus

Schreibe zusätzlich eine Klasse Haus, die ein Radio-Objekt in ihrer main-Funktion aufbaut.

Lösung

Operationen eines Radios

Implementiere eine Klasse Radio mit folgenden (nicht statischen) Methoden:

Innerhalb von Haus sollen nun in der main()-Methode die Objektfunktionen des Radios getestet werden. Damit kommt die Radio-Klasse ohne main()-Methode aus. Sie wird in Haus eingesetzt. Dann soll etwa Folgendes möglich sein:

Radio omisAltesRadio = new Radio(); 
omisAltesRadio.an(); omisAltesRadio.lauter(); 
omisAltesRadio.lauter(); 
System.out.println( omisAltesRadio.toString() ); 
omisAltesRadio.aus();

Lösung

Private geheime Eigenschaften

Ist es sinnvoll, das Element lautstärke aus dem Radio privat zu machen?
Was kann passieren, wenn es öffentlich ist? Denke etwa an den Wertebereich. Wenn ja, deklariere es als geheim.

Statische Eigenschaften

Statische Methoden (15 Min)

Implementiere eine statische Methode double toFreq(String), die einem Sender als Zeichenkette eine Frequenz zuordnet (zum Beispiel hat BFBS die Frequenz 103.0). Stringvergleiche können mit equals() definiert werden. Im Hauptprogramm kann man dann schreiben:

 System.out.println( Radio.toFreq("BFBS") ); // 103.0

Debug-Klasse

Implementiere eine Klasse Debug mit der statischen Methode out(String) sowie zwei Methoden zum Ein-/Ausschalten. Wird etwas debuggt, so wird es auf dem Bildschirm ausgegeben.

Lösung

Aufzählungen und Konstanten

Aufzählungen (20 Min)

Ein Radio soll sich ein Frequenzband merken können:

Lösung

Konstruktoren

Konstruktoren

Ein Element suchen

Schreibe ein Unterprogramm, welches eine Frequenz in einer Liste sucht. Erweitere dazu die Funktion toFreq(String). Die Arbeitsweise kann etwa so aussehen, dass intern zwei Listen verwaltet werden: eine mit den Zeichenketten und eine mit den dazugehörigen Frequenzen. Wir können aber auch nur eine Liste verwenden, in der String und Wert als String hintereinander stehen.

Assoziationen und Vererbung

Ein Fernseher *

Implementiere eine Klasse Fernseher mit dem Attribut int programm und den Methoden an()/aus(). Die Klasse soll in einer eigenen Datei definiert werden.

Assoziationen *

Ein Fernseher hat eine Bildroehre. Wie kann man dies in Java Quellcode umsetzen? Implementiere eine unidirektionale Beziehung zwischen dem Fernseher und der Bildröhre.

Die Bildroehre soll Methoden an()/aus()-Funktionen haben, die eine kleine Meldung auf dem Bildschirm ausgeben, wenn auch der Fernseher an-/ausgeschaltet wird.

Überlege, wie eine bidirektionale Beziehung implementiert werden kann. Wo liegt ein Problem?

Vererbung *

Lösung

Überschreiben von Methoden * (10 Minuten)

Implementiere eine Klasse Feuermelder als Unterklasse von Konsumgeraet, die die Methode aus() mit leerem Rumpf implementiert, sodass sich der Feuermelder nicht ausschalten lässt.

Aufruf der Funktionen der Oberklasse *

Die Fernseher-Klasse hat schon Methoden ein()/aus(). Erweitert auch Fernseher die Klasse Konsumgeraet überschreibt ein Fernsehen somit die Methoden der Oberklasse Konsumgeraet. Es ergibt sich aber ein Problem:

Wie lässt sich das Problem lösen?

private und protected Konstruktor *

Schreibe eine leere Klasse mit einem privaten Konstruktor. Welche Fehlermeldung folgt, wenn ein Objekt der Klasse gebildet werden soll. Bilde eine Unterklasse. Was ist hier die Meldung des Compilers? Ändere das Zugriffsrecht auf protected. Wer kann jetzt ein Exemplar der Klasse bilden?

Vererbungsfragen **

Werden Konstruktoren vererbt? Erkläre das Verhalten der beiden Klassen.

class A
{
 int number;
 A( int i )
 {
   number = i;
 }
}
class B extends A
{
  static public void main( String args[] )
  {
    B b1 = new B();
    B b2 = new B(3);
  }
}

Was sollte man daher in Klassen beachten, von denen andere Klassen abstammen sollen und die die Konstruktoren mit Argumenten implementieren?

Ein Haus als Container **

Schreibe eine neue Klasse Wohnsiedlung mit einer main()-Funktion, die zwei Häuser aufbaut.

Implementiere zwei neue Funktionen für die Klasse Haus:

Die Geräte selbst sollen im Haus intern in einer privaten dynamischen Datenstruktur wie der java.util.ArrayList<Konsumgeraet> gehalten werden:

private ArrayList<Konsumgeraet> konsumgeraete = new ArrayList<Konsumgeraet>();

Polymorphie **

Implementiere in der Haus-Klasse eine Methode urlaub(), die alle Konsumgeräte in einem Array ausschaltet.

public void urlaub()
{
  // rufe aus() für alle Elemente im internen Feld aus
}

In der main()-Funktion steht dann:

Radio schlafzimmerradio = new Radio();
Radio wohnzimmerradio = new Radio();
Fernseher bügeltv = new Fernseher();
Radio kloRadio = new Radio();
Feuermelder alarm = new Feuermelder();
Haus h = new Haus(); 
h.add( schlafzimmerradio );
h.add( wohnzimmerradio );
h.add( bügeltv );
h.add( kloRadio );
h.add( alarm );
h.urlaub();

Lösung für die Klasse Haus

Abstrakte Klassen und Schnittstellen

Schnittstellen *

Ein Haus soll eine Größe (qm) bekommen. Deklariere ein privates Attribut qm und Setter/Getter. Eine toString()-Funktion soll etwas folgendes zurückgeben: Haus[fläche=123].

Bauen in der Wohnsiedlung Häuser mit verschiedenen Größen auf.

Die Klasse HausComparator soll die Schnittstelle java.util.Comparator implementieren und Häuser nach ihrer Größe anordnen können.

Comparator c = new HausComparator();
System.out.println( c.compare(haus1, haus2) );
System.out.println( c.compare(haus1, haus3) );
System.out.println( c.compare(haus2, haus3) );

Würde man String-Objekte eines Feldes sortieren wollen, dann könnten man die Arrays.sort()-Funktion nutzen. Doch möchte man eigene Objekte in eine Reihenfolge bringen, so muss man der Funktion sagen, wann ein Objekt etwa "kleiner" ist als ein anderes. Dazu lässt sich unser HausComparator verwenden; er ist Voraussetzung für Objekte, die man sortieren möchte — das verrät auch schon die Signatur sort(Object[] a, Comparator c).

System.out.println( Arrays.toString(array) );
Arrays.sort( array, hausComparator );
System.out.println( Arrays.toString(array) );

Pakete

Pakete *

Was ist ein Paket und welche Klassen kann man bei den Konsumgeräten in welches Paket legen? Setze die Klassen in das passende Paket und binde mit korrekten import-Anweisungen die Klassen ein.

Was ist bei Klassen mit gleichen Namen in verschiedenen Paketen zu berücksichtigen?

Wiederholungsaufgabe

Kreise und Rechtecke *

Lösung für Form
Lösung für FormContainer
Lösung für Kreis
Lösung für Rechteck
Lösung für Formdemo, einem Hauptprogramm