In der objektorientierten Programmierung begrenzt man normalerweise den Zugriff von Objekteigenschaften (Attribute) auf die Methoden einer Klasse. Man spricht von Kapselung. Gleichzeitig möchte man direkt beim Erzeugen eines neuen Objektes dessen Attribute setzen. Dies ist möglich mit dem sogenannten Konstruktor.
In diesem Artikel lernst Du set- und get-Methoden, die Bedeutung der Modifier, das UML-Klassendiagramm und Konstruktoren kennen.
Leuchtmittel
werden folgende Eigenschaften für die Leuchtmittel definiert: Leistungsaufnahme P in W (Watt), Spannung U in V (Volt) und Strom I in A (Ampere). Die Leistung kann mit P = U ⋅ I berechnet werden.
public class Leuchtmittel{ public double spannung; public double strom; public double leistung; }
Lampe
Eine Wagenradlampe der Klasse Lampe
besteht aus Objekten der Leuchtmittel. Wir erstellen nun ein Objekt:
public class Lampe { public static void main(String[] args) { Leuchtmittel l1 = new Leuchtmittel(); //Objekterzeugung L1 l1.spannung = 230.0; l1.strom = -0.1; //Problem: negativer Wert l1.leistung = 60.0; //Problem: P ist von U und I abhängig } }
Folgende Probleme treten auf:
Lampe
kann die Leistung unabhängig von Spannung und Strom setzen. Die Leistung eines Leuchtmittels ist aber von dessen Spannung und Stromaufnahme abhängig. So können Leuchtmittel entstehen, die es in der realen Welt gar nicht gibt.Leuchtmittel
Wir ersetzen den Modifier der Attribute in der Klasse Leuchtmittel
beschränkt. Diesen Vorgang nennt man Kapselung. Man schirmt die Attribute vom Zugriff aus anderen Klassen ab.
Um nun die Werte noch ändern zu können benötigt man die sogenannten set-Methoden; für den Wertzugriff die get-Methoden.Der indirekte Zugriff auf die Leuchtmittelattribute erfolgt aus der Klasse Lampe
:
public class Lampe { public static void main(String[] args) { Leuchtmittel l1 = new Leuchtmittel(); //Objekterzeugung l1 l1.setSpannung(230.0); l1.setStrom(0.1); System.out.println(l1.getLeistung()); } }
public class Leuchtmittel{ private double spannung = 0; private double strom = 0; private double leistung = 0; public void setSpannung(double u){ if(u<=0) System.out.println("Wert fehlerhaft"); this.spannung = u; this.leistung = u * this.strom; } public void setStrom(double i){ if(i<=0) System.out.println("Wert fehlerhaft"); this.strom = i; this.leistung = i * this.spannung; } public double getLeistung(){ return this.leistung; } }
Modifier | Die Klasse selbst | Paketklassen und innere Klassen | Unterklassen | sonstige Klassen |
---|---|---|---|---|
private | ✓ | ✗ | ✗ | ✗ |
public | ✓ | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✓ | ✗ |
ohne | ✓ | ✓ | ✗ | ✗ |
Erstelle die Klasse Leuchtmittel und Beleuchtung.
Leuchtmittel
und deklariere die Attribute private double spannung
, private double strom
, private double leistung
und private double dimmfaktor
.public void setSpannung(double u){ }
,public void setStrom(double i){ }
,public double getLeistung(){ }
,public void setDimmfaktor(double f){ }
,public double getDimmfaktor(){ }
.Beleuchtung
. Erzeuge drei Leuchtmittel als Objekte und weiße jedem Leuchtmittel Strom, Spannung zu.Mit Hilfe von Konstruktoren kann man beim Erzeugen neuer Objekte, dessen Attribute initialisieren. Der Konstruktor ist eine Methode die beim Erzeugen eines Objekts aufgerufen wird und den identischen Namen wie die Klasse hat. Der Standardkonstruktor für die Klasse Schaf
sieht wie folgt aus:
public class Schaf{ public String name; public int alter; public Schaf (){ } }
Um nun Standardwerte zu vergeben oder beim Erzeugen des Objekts die Attribute zu setzen, wird die Konstruktormethode überladen.
void
wird nicht verwendet. Sobald man einen neuen Konstruktor erstellt, existiert der alte Standardkonstruktor nicht mehr.
public class Schaf{ private String name; private int alter; public Schaf (){ this.name="anyname"; } public Schaf (String name, int alter){ this.name = name; this.setAlter(alter); } }
public class Schafherde { public static void main(String[] args) { //Aufruf des Standardkonstruktors Schaf s1 = new Schaf(); //Konstruktoraufruf mit Parameter Schaf s2 = new Schaf("Emma",20); } }
Konstruktoren werden nun beim Erzeugen der Objekte aufgerufen. Der Aufruf muss entsprechend zu einer der Konstruktormethoden passen.
Nenne die Klasse, welche auf ein private
Attribut Zugriff hat.
Wähle eine Antwort.
Nenne Vorteile der Kapselung.
Wähle zwei Antworten.
Finde die Anzahl der Fehler im folgenden Quelltext.
public double setStrom(double i){ if(i<=0) System.out.println("Wert fehlerhaft"); strom = i; this.leistung = i * this.spannung; }
Finde die Anzahl der Fehler im folgenden Quelltext.
private double leistung; public int getLeistung(double p){ return this.leistung; }
Bestimme die zugehörige Konstruktormmethode, zum Konstruktoraufruf Schaf s2 = new Schaf(20,23.3);
. Wähle eine Antwort.
public Schaf(int a, double b){...}
public int Schaf(int a, double b){...}
public Schaf(double alt, int gew){...}
public Schaf(int a, int g){...}
Beschreibe einen Konstruktor.
Wähle beliebig viele Antworten.
Die Schafe sollen mit set-get-Fähigkeiten und Konstruktoren ausgestattet werden.
Schaf
mit folgenden set-get-Methoden:public void setName(String name) {..}
public void setAlter(int alter) {..}
public void setGewicht(double gewicht) {..}
,public void setGewicht(int mengeGras, int mengeKohl ) {..}
,public String getName() {..}
,public int getAlter() {..}
,public double getGewicht() {..}
.Schaf
mit einem neuen Standardkonstuktor:public Schaf( ) {..}
. Initialisiere den Namen mit "noname", das Alter mit 1 Jahr sowie das Gewicht mit 0.0 kg.Schaf
mit dem weiteren Konstuktor:public Schaf(String name, int alter, double gewicht) {..}
.Schafherde
die neuen Methoden und Konstruktoren ausführlich. Lass alle Änderungen der Attribute jeweils anzeigen.Erweitere die Klasse Auto und Fuhrpark.
Auto
mit set- und get-Methoden.Auto
auf private
Fuhrpark
durch Aufrufe der set- und get-Methoden und teste so die Funktionalität der Klasse Auto
.Auto
mit zwei Konstruktormethoden, den Standardkonstruktor mit Initalwerten und einem Konstruktor mit Parameterliste.UML (engl. unified modeling language) ist eine grafische Modellierungssprache zur Spezifikation, Konstruktion und Dokumentation von Software-Teilen und anderen Systemen. UML besteht aus vielen Diagrammtypen. Ein Typ davon ist das Klassendiagramm.
Ein Klassendiagramm stellt eine Klasse übersichtlich und strukturiert dar. Es ist von der Form her rechteckig und besteht aus drei Teilen:
+
für public
und -
für private
) und Datentyp,
Man beachte, das statische Methoden und Attribute unterstrichen werden.
Was das Klassendiagramm nicht sagt:
Auto |
- farbe : String - leistung : int - preis : double - mehrwertsteuer : double |
+ Auto (String farbe, int leistung, double preis) + setFarbe (String color) : void + setLeistung (int power) : void + setMwSt (double mwst) : void + getFarbe () : String + getLeistung () : int + getMwSt () : double + fahrenStrecke (int km) : void + tanken (int menge) : void |
Schreibe UML-Klassendiagramme.
Auto
.Fuhrpark
.Schaf
.Schreibe weitere Klassenpaare.
Neben den Klassenpaaren Schaf
und Schafherde
sowie Auto
und Fuhrpark
, gibt es weitere Klassenpaare.
Wohnmobil
und Campingplatz
.Pizza
und Menue
.Sensor
und Home
.Speichert man die verschiedenen Objekte direkt beim Erzeugen in einer ArrayList
können mit Hilfe von Schleifen automatisierte Ausgaben und Auswertungen aller Objekte generiert werden. Dabei muss im Vergleich zu einem array
die genaue Anzahl der Objekte vorab nicht bekannt sein. Mit der add(..)
Methode wird ein Element dem Container hinzugefügt.
import java.util.ArrayList; public class SchafherdeArrayList { public static void main(String[] args) { //Anlegen einer ArrayList namens schafListe ArrayList<Schaf> schafListe = new ArrayList<Schaf>(); //Hinzufügen von Einträgen mit der Methode add(..) schafListe.add(new Schaf("Emma", 20, 50.0)); schafListe.add(new Schaf("Berta", 8, 30.0)); } }
ArrayList
ist eine Klasse, die als Container für eine Liste von Objekten dient. Ähnlich wie bei einem Array kann man auf die Objekte über einen Index zugreifen, jedoch muss die Objektanzahl in der Liste anfangs nicht angegeben werden.
Um nun Standardwerte zu vergeben oder beim Erzeugen des Objekts die Attribute zu setzen, werden entsprechende Konstruktormethoden erstellt.
Des weiteren benötigen wir wie gehabt entsprechende set- und get-Methoden.
public class Schaf{ private String name; private int alter; private double gewicht; //Konstruktor public Schaf (String n, int a, double g){ this.name = n; this.alter = a; this.gewicht = g; } //set- und get-Methoden ... }
//Ausgabe aller Schafe und deren Alter for (int i=0; i<schafListe.size(); i++) { Schaf schaf = schafListe.get(i); System.out.println("Schaf "+(i+1)+": "+schaf.getName()); System.out.println("Alter: "+schaf.getAlter()); } //Berechnung des mittleren Herdenalters int gesamt = 0; for (Schaf schaf: schafListe) { gesamt += schaf.getAlter(); } double herdenalter = (double)gesamt/schafListe.size(); System.out.printf("Herdenalter: %.1f",herdenalter);
In der for-Schleife wird über die size()
Mehtode die Anzahl der Elemente abgefragt. Die get(..)
Methode gibt das Element am angegebenen Index zurück.
for-each-Schleifen iterrieren über alle Datenstrukturen deren Elemente aufzählbar sind. In Java werden diese mit dem : Operator gekennzeichnet. Dabei ist Schaf
der Datentyp des Elements und schaf
das Elementobjekt welches aktuell betrachtet wird. Das Containerobjekt schafListe
gehört zur Klasse ArrayList
.
For-each-Schleifen haben eine kürzere und übersichtlichere Syntax. For-Schleifen erlauben einen Zugriff auf den Schleifenzähler.
add(..)
, size()
und get(..)
sind die essentiellen Methoden der Klasse ArrayList
.
Realisiere eine Bücherei in der Bücher mit Titel, Autor und Bewertung gespeichert werden sollen.
Book
und Library
. Book
die Attribute title
, author
, rating
hinzu sowie entsprechende set- und get-Methoden.Library
eine ArrayList
namens booklist
hinzu und erzeuge drei Einträge wie bspw. booklist.add(new Book("Herr der Ringe", "J.R.R. Tolkien", 4.8));
.Für Objekte der Klasse Schaf
soll eine ArrayList erstellt werden.
Wähle eine Antwort.
ArrayList box = new ArrayList();
ArrayList<Schaf> box = ArrayList<Schaf>();
ArrayList<Schaf> box = new ArrayList<Schaf>();
ArrayList schafListe = new ArrayList();
Erkläre die Klasse ArrayList
.
Wähle eine Antwort.
Finde die Anzahl der Fehler im folgenden Quelltext.
import java.util.ArrayList; public class Pizzamenu { public static void main(String[] args) { ArrayListmenue = new ArrayList (); menue1.add(new schaf()); } }
Finde die Anzahl der Fehler im folgenden Quelltext.
public class Pizza{ private String name; public Pizza (String name, double preis){ this.name = namen; this.preis = preis; } }
In der ArrayList box
sind 3 Schafe im Alter von jeweils 3 Jahren.
int i = 3;
for (Schaf schaf: box) {
i += schaf.getAlter()-1;
}
Bestimme den Wert von i
. Wähle eine Antwort.
In der ArrayList box
sind zwei Schafe namens Emma und Berta.
for (int i=0; i<box.size(); i++) {
Schaf schaf = box.get(i);
System.out.print(schaf.getName());
}
Bestimme die Ausgabe. Wähle eine Antwort.
das Objekt, -e | Objekte haben Eigenschaften (engl. states) und Fähigkeiten (engl. behaviors). Diese werden in einer zugehörigen Klasse festgelegt. |
die Klasse, -n | Eine Klasse beschreibt, welche Eigenschaften und Fähigkeiten ein Objekt haben darf und stellt somit den Bauplan von Objekten bereit. |
die Methode, -en | Fähigkeiten von Objekten werden in Methoden beschrieben. |
das Attribut, -en | Eigenschaften von Objekten werden in Attributen (Variablen) festgelegt. |
der Modifier, ~ | legt die Sichtbarkeit von Eigenschaften und Fähigkeiten fest, also ob diese bspw. privat oder öffentlich zugänglich sind |
die Kapselung, - | die Sichtbarkeit der Attribute einer Klasse wird auf private gesetzt und so schirmt man die Attribute vom Zugriff aus anderen Klassen ab. |
die set-, get-Methoden, - | Methoden die die abgeschirmten Attribute setzen oder auslesen. |
der Konstruktor, -en | Methode welche die Initialisierung der Parameter bei Objekterzeugung ermöglicht |
das Überladen des Konstruktors | Existieren mehrere Methoden gleichen Namens spricht man vom Überladen. So kann bspw. mit mehreren Konstruktoren ein unterschiedlicher Initialisierungsgrad erreicht werden. |
die ArrayList | eine Klasse, die als Container für eine Liste von Objekten dient |