5th Java Lesson (Java Course @ TUD)

https://github.com/Trivo25/tud-java-course

November 18, 2021

Während Ihr darauf wartet, dass es beginnt..

Java

Objektorientierte Programmierung

Florian Kluge, Moritz Schulz

  1. November 2021


Florian.Kluge@mailbox.tu-dresden.de

Moritz.Schulz2@mailbox.tu-dresden.de

Was wir heute machen

Grundlagen der OBJEKTorientierten Programmierung

  1. Scopes
  2. Programme betrachten
  3. Klassen
  4. Objekte
  5. Methoden und Attribute

Contact

Florian Kluge

Florian.Kluge@mailbox.tu-dresden.de

Moritz Schulz

Moritz.Schulz2@mailbox.tu-dresden.de

Kurze Info zum Kurs

  • bitte abmelden / entschuldigen, wenn ihr nicht kommt
    • zwei Mal in Folge unentschuldigt fehlen => ausgetragen
  • praktische Aufgaben- und Beispiel-basierte Lernweise
    • wir laufen herum und gucken, dass ihr zurecht kommt
  • bitte, fragt gern, jederzeit
    • auch per E-Mail / via Kursseite
  • uns geht es darum, alle mitzunehmen

Stay up to date

  • die E-Mails der TUD regelmäßig überprüfen
    • z.B. Bekanntgabe der Veröffentlichung der Folien
      • auf der Seite des Programmierkurses

Los geht’s!

Scopes

  • Ein Programm hat viele verschachtelte Blöcke: (etwa) {}
  • Jeder Block bildet mit seinen untergeordneten einen “Scope”
    • diese habe ich mit A, B, C, D benannt
public class Programm {
                        // A
    public static void main(String[] args) {
                        // A,B
        if (true) {
                        // A,B,C
        }
        if (false) {
                        // A,B,D
        }
    }
}

Scopes

  • Wenn Variablen deklariert werden, gelten sie
    • ab dieser Zeile
    • in dem Scope
    • in untergeordneten Scopes
  • mit dem Verlassen des Scopes werden Sie gelöscht
public class Programm {         
                            // i???
    public static void main(String[] args) {   
                            // i???
        if (true) {
                            // i???
            int i = 3;
                            // i == 3
            if (302>102) {
                            // i == 3
            } 
                            // i == 3
        } // (Verlassen des Scopes von i)
                            // i???
        if (false) {
                            // i???
        }
                            // i???
    }
}

Scopes

  • mehrere Variablen mit gleichem Namen können deklariert werden, wenn sich ihre Scopes nicht überschneiden
public class Programm {         
                                   // i???
    public static void main(String[] args) {   
                                   // i???
        if (true) {
                                   // i???
            int i = 3;
                                   // i == 3
            if (302>102) {
                                   // i == 3
            } 
                                   // i == 3
        } // (Verlassen des Scopes von i)
                                   // i???
        if (false) {
                                   // i???
            int i = 99; 
                                   // i == 99
            System.out.println(i);
                                   // i == 99
        } // (Verlassen des Scopes von i)
                                   // i???
    }
}

Scopes

  • Ausnahme bei mehreren Variablen mit gleichem Namen:
    • Variablen im Klassen-Scopes können von innerhalb von Funktionen und Methoden “überschattet” werden
  • Achtung: Fehlerquelle
public class Programm {
    static float x = 3.0f;

    public static void main(String[] args) {   
        System.out.println(x);    // prints: 3.0
        int x = -7;
        System.out.println(x);    // prints: -7
    }
}
Programme betrachten 1: Scopes
public class Programm {
    static int i = 0;
    public static void main(String[] args) {
        System.out.println(i);
        for (int z = 99; i < 10; i++) {
            int i = 0;
            System.out.println(i);
        }
        System.out.println(i);
    }
}
  • Läuft das Programm unendlich lang?
  • Was gibt das Programm aus?
Programme betrachten 1: Scopes
  • Übrigens: bei for kann das 1. und 3. Statement weggelassen werden
public class Programm {
    static int i = 0;
    public static void main(String[] args) {
        System.out.println(i);
        for (; i < 5; i++) {
            int i = 0;
            System.out.println(i);
        }
        System.out.println(i);
    }
}
  • Läuft das Programm unendlich lang?
  • Was gibt das Programm aus?
Programme betrachten 1: Scopes (Lösung)
  • nein, es läuft nicht unendlich lang
  • Ausgabe: 6 mal 0, 1 mal 5
  • Das i im Body von for
    • ist nicht das i aus dem Kopf/Head von for
    • überschattet das i aus dem Klassen-Scope
Programme betrachten 2: Funktionen und Scopes
public class Programm {
    public static void main(String[] args) {
        String name = "Jamie";
        gruss();
    }
    
    public static void gruss() {
        System.out.println("Hallo, " + name);
    }
}
  • Wo liegt der Fehler?
  • Wie können wir ihn beheben?
Programme betrachten 2: Funktionen und Scopes
public class Programm {
    public static void main(String[] args) {
        String name = "Jamie";
        gruss();
    }
    
    public static void gruss() {
        System.out.println("Hallo, " + name);
    }
}
  • Wo liegt der Fehler?
  • Wie können wir ihn beheben?
  • Hinweis: Was ist der Scope von name?
Programme betrachten 2: Funktionen und Scopes

Problem gelöst?

public class Programm {
    public static void main(String[] args) {
        String name = "Jamie";
        gruss(name);
    }
    
    public static void gruss() {
        System.out.println("Hallo, " + name);
    }
}
Programme betrachten 2: Funktionen und Scopes
  • Nein: die Funktion muss genau die Art und Anzahl von Parametern enthalten, die in ihrer Definition angegeben sind: in den runden Klammern ()
public class Programm {
    public static void main(String[] args) {
        String name = "Jamie";
        gruss(name);
    }
    
    public static void gruss(String name) {
        System.out.println("Hallo, " + name);
    }
}
  • Dass die Variable beide Male name heißt, ist Zufall
Programme betrachten 2: Funktionen und Scopes

Hier wurde der Parameter (die Variable innerhalb) der Funktion umbenannt.

public class Programm {
    public static void main(String[] args) {
        String name = "Jamie";
        gruss(name);
    }
    
    public static void gruss(String adressant) {
        System.out.println("Hallo, " + adressant);
    }
}
Programme betrachten 3: Funktionen

Was gibt das Programm aus?

public class Programm {
    public static void main(String[] args) {
        int alter = 29;
        erhoehe(alter);
        System.out.println(alter);
    }
    
    public static void erhoehe(int alter) {
        alter = alter + 1;
        System.out.println(alter);
    }
}
Programme betrachten 3: Funktionen
  • in Java sind Parameter von Funktionen “pass-by-value”
    • der Wert wird übergeben, nicht der Speicherplatz
  • Umgehen: Rückgabewert, Überschreiben der Variable
public class Programm {
    public static void main(String[] args) {
        int alter = 29;
        alter = erhoehe(alter);  // Variable neu belegen
        System.out.println(alter);
    }
    
    public static int erhoehe(int alter) { // void -> int
        alter = alter + 1;
        System.out.println(alter);
        return alter;           // Wert zurückgeben
    }
}

objektorientierte Programmierung

  • Klassen, Objekte, Instanzen und Co

objektorientierte Programmierung

Was ist objektorientierte Programmierung?

  • wir bündeln Programmcode und Daten in Klassen
  • mit Klassen können wir die “echte Welt” modellieren

Klassen

Was sind Klassen?

  • Klassen sind “Vorlagen”
  • Klassen definieren Gemeinsamkeiten von Objekten
  • Aus Klassen können Objekte gebildet werden

Klassen und Objekte: Beispiel Hund

  • Klasse “Hund”
    • Eigenschaften (Attribute)
      • Anzahl von Beinen
      • Schulterhöhe
      • Name (von Hund zu Hund verschieden)
    • Verhalten (Methoden)
      • Bellen
      • Fressen
  • mehrere Objekte vom Typ Hund: “konkrete Hunde”

Klassen und Objekte: Beispiel Hund

  • Laika ist ein Hund
    • Eigenschaften
      • Anzahl von Beinen: 4
      • Schulterhöhe: 45cm
      • Name: Laika
    • Verhalten
      • Bellen
      • Fressen
  • Laika ist ein Objekt der Klasse Hund
    • konkrete Werte für die Attribute
    • übernimmt Verhalten (Methoden)

Klassen

  • Klassen (z.B. Klasse Hund) bestehen aus ..
    • Eigenschaften
      • Attribute (Variablen eines Objekts)
      • statischen Variablen (einer Klasse - für alle Objekte gleich)
    • Verhalten
      • Methoden (Funktionen eines Objekts)
      • Funktionen (einer Klasse - für alle Objekte gleich)

Klassen

  • Übrigens: in Java ist fast alles eine Klasse bzw. ein Objekt einer Klasse
    • unser erstes Programm bestand aus einer Klasse
  • In Java werden Programme mit Klassen strukturiert
public class MeinProgramm {
    // ...
}

Objekte

  • Klassen sind nur Vorlagen bzw. Baupläne
  • Objekte sind Instanzen einer Klasse
  • ein Objekt ist eine “fertige Ausführung” einer Klasse
  • z.B. Laika ist ein Hund
  • Beispiel: Hausbau
    • der Bauplan ist die Klasse
    • ein Haus ist ein Objekt des Bauplans

Objekte

  • aus einer Klasse können ganz viele Objekte erstellt werden
  • durch Daten wird eine Klasse zum “Leben erweckt”
  • Objekte können wir in Variablen “speichern”
    • wir können sie erstellen, verändern und zerstören

Objekte und Klassen

und wie sieht das nun genau in Java aus?

Objekte und Klassen

und wie sieht das nun genau in Java aus?

public class MeineKlasse {
    // Attribute und Methoden
}

Objekte und Klassen

  • mit new können wir aus Klassen Objekte erstellen
    • Wiederholung: Objekte sind Instanzen von Klassen
public class MeineKlasse {
    // Attribute und Methoden
}

// ...
// zum Beispiel in main(String[] args):
new MeineKlasse();

Objekte und Klassen

  • Das Objekt können wir in einer Variable “speichern”
    • eigentlich wird nur ein Zeiger (eine Referenz) auf ein Objekt gespeichert
MeineKlasse klasse1 = new MeineKlasse();
int zahl = 483; 

Objekte und Klassen

  • ein kleines Beispiel..
class Kreis {
    public int durchmesser;
}
  • Kreise haben ein Attribut (“Objektvariable”) durchmesser

Objekte und Klassen

  • ein constructor wird beim Erstellen einer neuen Instanz aufgerufen
  • ein constructor ist eine Art “besondere Methode”
  • der Name vom contructor ist gleich dem Klassennamen
class Kreis {
    public int durchmesser;
    public Kreis() { // <- constructor
        System.out.println("Ein Kreis wurde soeben erstellt!");
    }
}

Objekte und Klassen

  • eine Beispielprogramm
class Kreis {
    public int durchmesser;
    public Kreis() {
        System.out.println("Ein Kreis wurde soeben erstellt!");
    }
}

public class Programm {
    public static void main(String[] args) {
        Kreis kreis1 = new Kreis();
    }
}

Objekte und Klassen

  • wir können auch auf die Attribute des Objektes zugreifen
class Kreis {
    public int durchmesser;
    public Kreis() {
        System.out.println("Ein Kreis wurde soeben erstellt!");
    }
}

public class Programm {
    public static void main(String[] args) {
        Kreis kreis1 = new Kreis();
        int durchmesser = kreis1.durchmesser;
    }
}

Objekte und Klassen

  • Kreis hat das Attribut durchmesser, aber wie können wir diesen bei der Erstellen des Objektes setzen?

Objekte und Klassen

class Kreis {
    public int durchmesser;
    public Kreis() {
        System.out.println("Ein Kreis wurde soeben erstellt!");
        durchmesser = 10;
    }
}

Das geht aber auch dynamisch.

Objekte und Klassen

Wir erinnern uns an Funktionen und Parameter!

// in der Klasse Kreis:
public Kreis(int kreisDurchmesser) {
    System.out.println("Ein Kreis wurde soeben erstellt!");
    durchmesser = kreisDurchmesser;
}

// zum Beispiel in main(String[] args):
Kreis kreis1 = new Kreis(10);
System.out.println(kreis1.durchmesser); // gibt 10 aus!

Objekte und Klassen

Erstellung eines Objektes und Zuweisung von Attribut-Werten
public class Programm {
    public static void main(String[] args) {
        Kreis kreis1 = new Kreis(10);
        int durchmesserKreis1 = kreis1.durchmesser;
        System.out.println(durchmesserKreis1);
    }
}

class Kreis {
    public int durchmesser;
    public Kreis(int durchmesserKreis) {
        durchmesser = durchmesserKreis;
        System.out.println("Ein Kreis mit durchmesser " + durchmesser
            + " wurde soeben erstellt!");
    }
}
Methoden in Objekten
  • Methoden sind wie Funktionen
    • für Objekte
    • können Attribute des Objekts nutzen
    • Kopf: ohne static
public class Programm {
    public static void main(String[] args) {
        Kreis kreis1 = new Kreis(10);
        float flaeche = kreis1.flaeche();
        System.out.println("Fläche: " + fleaeche);
    }
}

class Kreis {
    public int durchmesser;
    public Kreis(int durchmesserKreis) {
        durchmesser = durchmesserKreis;
        System.out.println("Ein Kreis mit durchmesser " + durchmesser
            + " wurde soeben erstellt!");
    }
    public float flaeche() {
        return 3.1415f * durchmesser * durchmesser / 4.0f;
    }
}

Beispiel: Klassen modellieren

Was haben alle Autos gemeinsam? (Attribute!)

Beispiel: Klassen modellieren

Was haben alle Autos gemeinsam? (Attribute!)

  • jedes Auto hat ..
    • Anzahl Räder
    • Lackierung/Farbe
    • Sitzplätze
    • Tank

Beispiel: Klassen modellieren

class Auto {
    public int anzahlSitze;
    public int anzahlRaeder;
    public int tankStand;
    public String farbe;
}

Beispiel: Klassen modellieren

Was kann jedes Auto? (Funktionalität!)

Beispiel: Klassen modellieren

Was kann jedes Auto? (Funktionalität!)

  • jedes Auto kann ..
    • fahren
    • tanken

Beispiel: Klassen modellieren

class Auto {
    public int anzahlSitze;
    public int anzahlRaeder;
    public int tankStand;
    public String farbe;
    
    public void fahren() {
        System.out.println("brrrrummmmm!");
    }
    
    public void tanken() {
        tankStand = 100;
        System.out.println("*Tank wurde aufgefüllt!");
    }
}
Beispielaufgabe: Würfel

Modelliert einen Würfel als Klasse.

Würfel haben folgende Attribute:

  • Seitenlänge

Würfel haben folgende Methoden:

  • eine, die das Volumen berechnet
  • eine, die den Oberflächeninhalt berechnet

Schreibt 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.

Beispielaufgabe: Würfel

Hinweise:

  • die Attribute des Objekts im Scope der entsprechenden Klasse deklarieren
    • also außerhalb von Methoden und Funktionen
  • entweder
    • main-Funktion & Attribute & Methoden in einer Klasse, oder
    • zwei Klassen machen:
      • eine Klasse “Programm” mit main-Funktion
      • eine Klasse “Würfel” mit Attributen und Methoden
        • Aufpassen: die Klasse “Würfel” sollte dann außerhalb der Klasse “Programm” stehen.
Beispielaufgabe: Würfel

Erweiterungsideen:

  • neue Methode: public void halbiereSeitenlängen()
    • ändert Seitenlänge auf die Hälfte
  • statt Würfel: ein Quader mit den gleichen Fähigkeiten, aber drei Seitenlängen-Attributen.
Beispielaufgabe: Würfel (Lösungsvorschlag)
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;
    }

}
Beispielaufgabe: Quader (Lösungsvorschlag)
public class Programm {
    public static void main(String[] args) {
        float a = 32;
        float b = 12;
        float c = 8;
        Quader quader1 = new Quader(a,b,c);
        quader1.halbiereSeitenlängen();
        System.out.println("Volumen: " + quader1.Volumen());
        System.out.println("Oberflächeninhalt: " + quader1.Oberflacheninhalt());
    }
}

class Quader{
    public float Länge,Breite,Höhe;
    public Quader(float a, float b, float c){
        Länge = a;
        Breite = b;
        Höhe = c;
    }

    public float Volumen() {
        return Länge*Höhe*Breite;    
    }

    public float Oberflacheninhalt() {
        return 2*Länge*Breite+2*Länge*Höhe+2*Breite*Höhe;
    }

    public void halbiereSeitenlängen() {
        Länge = Länge / 2;
        Breite = Breite / 2;
        Höhe = Höhe / 2;
    }
}

Nächste Stunde

  • Weiterführend: objektorientierte Programmierung
    • Festigung bisheriger Konzepte
    • Vererbung?

See course materials here: https://trivo25.github.io/tud-java-course/

Check out the Cheat Sheet: http://tiny.cc/java-cs