Implementiere eine Klasse Radio
mit folgenden Attributen:
eingeschaltet
, wenn ein Radio an oder aus ist. lautstärke
, wie laut spielt das Radio Musik? Welche Typen sind sinnvoll?
Schreibe zusätzlich eine Klasse Haus
, die ein Radio-Objekt in ihrer
main
-Funktion aufbaut.
Implementiere eine Klasse Radio
mit folgenden (nicht statischen)
Methoden:
void lauter()
/void leiser()
. Verändern die Objektvariable
lautstärke
.void an()
/void aus()
/boolean istAn()
.
Nutzen die Objektvariable eingeschaltet
. Die Methoden an()/aus()
sollen Meldungen wie "an"/"aus" auf dem Bildschirm ausgeben. (Optional: Die
Lautstärke soll nur im Bereich von 0 bis 100 liegen.)void wähleSender(double frequenz)
. Sie soll eine Frequenz intern
speichern, wie die Lautstärke. public String toString()
. Sie soll Informationen über den internen
Zustand als String zurückgeben, wobei die Zeichenkette die Form "Radio an: Freq=234,
Laut=2" haben sollte. 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();
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.
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
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.
Ein Radio soll sich ein Frequenzband merken können:
Band
mit den Werten AM
und FM
in der Klasse Radio
.Band band
ein, in der sich das
Radio das Frequenzband merkt.void setzeBand(Band band)
.toString()
-Funktion an.toFreq()
). Zudem
soll man das Band angeben können.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.
Implementiere eine Klasse Fernseher
mit dem Attribut int programm
und den Methoden an()/aus()
. Die Klasse soll in einer eigenen Datei
definiert werden.
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?
Radio
(Fernseher
erst einmal
ausgenommen) von der Klasse Konsumgeraet
ab. Implementiere eine Klasse Feuermelder
als Unterklasse von
Konsumgeraet
, die die Methode aus()
mit leerem Rumpf implementiert,
sodass sich der Feuermelder nicht ausschalten lässt.
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:
an()/aus()
. Wie lässt sich das Problem lösen?
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?
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?
Schreibe eine neue Klasse Wohnsiedlung
mit einer main()
-Funktion,
die zwei Häuser aufbaut.
Implementiere zwei neue Funktionen für die Klasse Haus
:
add(Konsumgeraet)
soll das Haus mit Konsumgeräten
füllen.anzahlKonsumgeraete()
soll fragen können, wie viele Konsumgeräte
im Haus sind.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>();
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();
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) );
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?
Kreis
und Rechteck
mit
den Eigenschaften x
, y
und für Rechteck höhe
,
breite
und für Kreis radius
vom Typ double
.
double fläche()
.
toString()
von Object, sodass die
Klassen sinnvolle Zeichenketten zurückgeben. Form
ab. fläche()
ebenso. FormContainer
, die eine void
add(Form f)
- Methode besitzt. Mit ihr soll man beliebige Form
-Objekte
im Container ablegen können. Intern soll der Container sich die Elemente in
einem Feld vom Typ Form
halten. double gesamtFläche
im Container, die
über alle Formen summiert und die Gesamtfläche zurückgibt. 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