Was wir heute machen
Grundlagen der OBJEKTorientierten Programmierung
- Scopes
- Programme betrachten
- Klassen
- Objekte
- Methoden und Attribute
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)
- 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
- 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
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
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!)
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:
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?