https://github.com/Trivo25/tud-java-course
November 25, 2021
Florian Kluge, Moritz Schulz
Florian.Kluge@mailbox.tu-dresden.de
Moritz.Schulz2@mailbox.tu-dresden.de
Festigung der Grundlagen der Objektorientierten Programmierung
Florian Kluge
Florian.Kluge@mailbox.tu-dresden.de
Moritz Schulz
Moritz.Schulz2@mailbox.tu-dresden.de
public Klassenname( /* Parameter */ ) { /* ... */ }
new
erstellt
Hund laika = new Hund(12, "Laika");
luca
?luca
?seitenlaenge
?a
?flaeche
in main(String[] args)
?Wo liegt der Fehler?
Was haben auto1
und auto2
gemeinsam?
public class Programm2 {
public static void main(String[] args) {
Auto auto1 = new Auto(7, 1996, "rot");
Auto auto2 = new Auto(7, 2014, "rot");
}
}
class Auto {
public int sitzplaetze;
public int baujahr;
public String farbe;
public Auto(int autoSitzplaetze, int autoBaujahr, String autoFarbe) {
sitzplaetze = autoSitzplaetze;
baujahr = autoBaujahr;
farbe = autoFarbe;
}
public static void beschreibe() {
System.out.println("Dieses Auto ist " + farbe);
}
}
Auto
sitzplaetze
und farbe
baujahr
Modelliert einen Würfel als Klasse.
Würfel haben folgende Attribute:
Würfel haben folgende Methoden:
halbiereSeitenlängen()
ändert Seitenlänge auf die HälfteSchreibt ein Programm, das ein Objekt vom Typ Würfel erstellt. Es soll ausgeben, welches Volumen und welcher Flächeninhalt vom Würfel-Objekt berechnet wird.
public class Programm {
public static void main(String[] args) {
float a = 7;
Würfel wuerfel1 = new Würfel(a);
wuerfel1.halbiereSeitenlängen();
System.out.println("Volumen: " + wuerfel1.Volumen());
System.out.println("Oberflächeninhalt: " + wuerfel1.Oberflacheninhalt());
}
}
class Würfel {
public float Seitenlänge;
public Würfel(float a){
Seitenlänge = a;
}
public float Volumen() {
return Seitenlänge*Seitenlänge*Seitenlänge;
}
public float Oberflacheninhalt() {
return 6*(Seitenlänge*Seitenlänge);
}
public void halbiereSeitenlängen() {
Seitenlänge = Seitenlänge / 2;
}
}
void
und float
bei den Methoden?return
auch weglassen werden?main(String[] args)
den float
nicht a
, sondern b
nennen würde?public class Würfel
schreiben?public float Seitenlänge
(Z. 13)public float Volumen()
, public float Oberflacheninhalt()
, public void halbiereSeitenlängen()
(Z. 18, 21, 24)Würfel wuerfel1
(Z. 4)void
heißt, kein Wert wird zurückgegeben. float
heißt, kein Wert wird zurückgegebenvoid
ist, ist ein return
erforderlichfloat a
(Z. 14)a
in b
auf Zeilen 3 und 4 ändere, funktioniert das. Der Scope von main(String[] args)
hängt nicht mit dem der Klasse Würfel
zusammen.java
-Datei kann es nur eine public class
gebena = Seitenlänge;
schreibe?Würfel
auch, einfach so, in die Klasse Programm
verschieben?public float Seitenlänge;
von der Klasse Würfel
in die Klasse Programm
verschiebe?public void halbiereSeitenlängen()
von der Klasse Würfel
in die Klasse Programm
verschiebe?Seitenlänge
im Würfel auf dem Standardwert 0Würfel
und Programm
überschneiden sich nicht. Das heißt, dass Seitenlänge
innerhalb der Klasse Würfel
nicht bekannt wäre.public void halbiereSeitenlängen()
eine Fehlermeldung entstehen, weil die Variable Seitenlängen
in der Klasse Programm
nicht bekannt ist. Zum Anderen würde auf Zeile 5 ein Fehler entstehen, weil die Methode halbiereSeitenlängen()
dann nicht für Objekte der Klasse Würfel
definitiert wäreWas gibt das Programm aus?
public class Demonstration {
public static void main(String[] args) {
int hoehe = 393;
Hochhaus hh = new Hochhaus(3000);
System.out.println(hoehe);
hoehe = hh.hoehe;
System.out.println(hoehe);
}
}
class Hochhaus {
public int hoehe;
public Hochhaus(int hoehe) {
hoehe = hoehe;
System.out.println("Die Höhe ist: " + hoehe);
}
}
Ausgabe:
Die Höhe ist: 3000
393
0
Wieso?
Die hoehe
von hh
bleibt 0
. Denn auf Zeile 14 wird beide Male die Höhe von Zeile 13 gemeint.
Wie können wir das Problem beheben?
Parameter vom Konstruktor umbenennen
this.
verwenden.this
ist das aktuelle Objekt.public class Demonstration {
public static void main(String[] args) {
int hoehe = 393;
Hochhaus hh = new Hochhaus(3000);
System.out.println(hoehe);
hoehe = hh.hoehe;
System.out.println(hoehe);
}
}
class Hochhaus {
public int hoehe; // <-- diese ist mit this.hoehe gemeint
public Hochhaus(int hoehe) {
this.hoehe = hoehe; // nur hier eine Änderung
System.out.println("Die Höhe ist: " + hoehe);
}
}
public
, private
, protected
, static
, final
, ..public
und private
Modifierpublic
und private
bestimmen von wo wir auf die Attribute und Methoden einer Klasse zugreiffen können
public
) oder nur privat (auch intern) (private
)protected
(Standardwert) klären wir späterprivate
Modifierprivate
gekennzeichnet sind können wir nur innerhalb der Klasse zugreifenclass Auto {
private String farbe;
public void printColor() {
// hier haben wir zugriff auf farbe
System.out.println(farbe);
}
}
// ...
public class Programm {
public static void main(String[] args) {
Auto auto1 = new Auto();
// hier haben wir auf farbe keinen Zugriff!
System.out.println(auto1.farbe); //geht nicht
auto1.farbe = "türkis"; //geht nicht
}
}
private
im Vergleich zu public
public
erlaubt uns auf Attribute und Methoden außerhalb der Klasse zuzugreifenprivate
Attribute lesen und veränderngetter
und setter
-Methodengetter
sind wie ein ‘Read-Only’-Mechanismusclass Auto {
private String farbe;
// getter-Methode für das Attribut farbe
public String getFarbe() {
return farbe;
}
}
// ...
public class Privat {
public static void main(String[] args) {
Auto auto1 = new Auto();
// hier haben wir _indirekten_ Zugriff auf die Farbe
System.out.println(auto1.getFarbe());
}
}
private
Attribute lesen und verändernsetter
können wir private-Attribute ändern, mit der Hilfe von Funktionenclass Auto {
private String farbe;
// setter-Methode um die Farbe zu ändern
public String setFarbe(String neueFarbe) {
farbe = neueFarbe;
}
}
// ...
public class Privat {
public static void main(String[] args) {
Auto auto1 = new Auto();
// hier haben wir _indirekten_ Zugriff auf die Farbe
auto1.setFarbe("blau");
}
}
getter
und setter
?getter
haben wir einen ‘Read-Only’ Mechanismus
setter
können wir kontrolliert Attribute ändern und setzen
setter
final
final
deklariert und direkt belegtfinal
Attribute können also nachträglich nicht verändert werden!public static void main(String[] args){}
private
, public
, protected
)
static
und final
Bankkonto
welches folgende Attribute hat
Bankkonto
um folgende Methoden (Parameter ausgelassen):
Pokemon
mit folgenden Attributen:
Pokemon
soll folgende Methoden haben (Parameter ausgelassen):
See course materials here: https://trivo25.github.io/tud-java-course/
Check out the Cheat Sheet: http://tiny.cc/java-cs