Objekte und Klassen INE2 M. Thaler, tham@zhaw.ch Office TG208 http://www.zhaw.ch/~tham 1
Um was geht es? typedef struct Konto { double saldo; int id; Konto; Modul "konto" konto.h konto.c Prozedurale Programmierung: Funktionen auf Daten anwenden Konto *neueskonto(double kapital, int id); void einzahlen(double betrag, Konto *kto); double abheben(double betrag, Konto *kto); 2 Konto *neueskonto(int kapital, int id) { Konto kt = (Konto*)malloc(sizeof(Konto)); kt->saldo = kapital; kt->id = id; return kt; static int main(void) { void einzahlen(double betrag, Konto *kto)*meinkonto, { *deinkonto; kto->saldo += betrag; meinkonto = neueskonto(2000, 260); deinkonto = neueskonto(4000, 333); double abheben(double betrag, Konto betrag *kto) { = abheben(1000, deinkonto); kto->saldo -=betrag; return betrag;... einzahlen(betrag, meinkonto); free(meinkonto); free(deinkonto);
... um was geht es? public class Konto { private int ktonr = 0; private double saldo = 0.0; public Konto(int ktonr, double kapital) { this.ktonr = ktonr; saldo = kapital; public void einzahlen(double betrag) { saldo += betrag; public double abheben(double betrag) {... saldo -= betrag; return betrag; Objektorientierte Programmierung - Methoden und Daten bilden eine Einheit: das Objekt - Objekte mit Klassen beschrieben static public void main(string[] args) { double betrag; Konto meinkonto = new Konto(260, 2000); Konto deinkonto = new Konto(333, 4000); 3 betrag = deinkonto.abheben(500); meinkonto.einzahlen(betrag);
Lernziele Siekönnen die Begriffe "Objekt" und "Klasse" erklären den Unterschied zwischen Klasse und Objekt erklären erklären wie eine Klasse aufgebaut ist die Begriffe "Instanzvariable", "Klassenvariable", "Instanzmethode" und "Klassenmethode" erklären "this" erklären und anwenden erklären was ein Konstruktor ist und wie er angewendet wird erklären wie Konstruktoren und Methoden überladen werden können und in Programmen korrekt anwenden Zugriffsmodifikatoren erklären und korrekt anwenden 4
Inhalt Objekte und Klassen Deklaration einer Klasse Instanzvariablen Konstruktor Methoden Zugriffsmodifikatoren Klassenvariablen und Methoden Deklaration von Objektvariablen 5
Leseempfehlung Grundkurs Java Dietmar Abts, Springer Vieweg Kapitel 3 elektronisch verfügbar, siehe ZHAW Bibliothek Grundkurs Programmiern in Java 8 Dietmar Ratz ed. alt., Hanser Verlag Kapitel 5.2, 6.3-6.5, 8 elektronisch verfügbar, siehe ZHAW Bibliothek 6
OO-Programme OO-Programme bestehen aus Objekten die miteinander interagieren Interaktion über Methoden - Objekte rufen gegenseitig Methoden auf traditionell spricht man von "Meldungen austauschen" Beispiel Konto static public void main(string[] args) { Konto meinkonto = new Konto(260, 2000); Konto deinkonto = new Konto(333, 4000); meinkonto.einzahlen(deinkonto.abheben(500)); 7
Objekte und Klassen Objekt = Daten/Zustand + Methoden Daten (Attribute, Felder) Eigenschaften des Objekts - unveränderlich - veränderlich Methoden ("Funktionen") Verhalten des Objekts - erlauben Zugriff auf interne Daten des jeweiligen Objektes Objekte können in Java nicht direkt programmiert werden Klasse beschreibt Struktur des Objektes Bauplan 8
... Objekte und Klasse "Bauplan" Klasse: Konto Kontonummer: Kontostand: einzahlen() abheben() getsaldo() Instanzierung mit new Instanzierung mit new "Realisierung" Objekt 1: meinkonto Kontonummer: 260 Saldo: 2000 einzahlen() abheben() getsaldo() Objekt 2: deinkonto Kontonummer: 333 Saldo: 0 einzahlen() abheben() getsaldo() 9
... Objekte und Klassen Klasse= BauplanfürObjekt Objekt ist Instanz der Klasse (Realisieriung) von einer Klasse können beliebig viele Objekte erzeugt werden Objekte werden zu Laufzeit mit new erzeugt Konto meinkonto = new Konto(260, 2000); Klasse neuer benutzerdefinierter Datentyp (Referenzdatentyp) Java Programme besteht aus mindestens einer Klasse - enthält main() Methode es können auch tausende sein 10
Deklaration einer Klasse Allgemeiner Aufbau class Klassenname { // Instanz- und Klassenvariablen // Deklaration Konstruktoren // Deklaration Methoden und Klassenmethoden Konvention Klassenname gross beginnen, "CamelCase" Substantiv im Singular Klasse neuer benutzerdefinierter Datentyp Referenzdatentyp 11
Instanzvariablen Instanzvariablen Satz von Variablen pro Objekt (bzw. Instanz) Attribute i.d.r private nur innerhalb des Objekts sichtbar werden mit 0, null, false, etc. intialisiert Beispiel jedes Konto hat eigenen Saldo und eigene Kontonummer class Konto { private int ktonr; private double saldo;... Konto meinkonto = new Konto(260, 2000); // ktonr meinkonto -> 260 // saldo meinkonto -> 2000 12 Konto deinkonto = new Konto(333, 4000); // ktonr deinkonto -> 333 // saldo deinkonto -> 4000
Instanzvariablen: this Instanzvariablen und Methodenparameter this was wenn gleicher Name? bezeichnet "eigenes Objekt" ist Schlüsselwort Beispiel class Konto { private int ktonr; private double saldo; public Konto(int ktonr, double kapital) { this.ktonr = ktonr; saldo = kapital; 13
Konstruktor Konstruktor spezielle Methode einer Klasse - Initialisierung der Variablen (bzw. des Objektzustandes) automatisch beim Erzeugen des Objekts aufgerufen (new) Implementation muss gleichen Namen wie Klasse haben nur Zugriffsmodfikator: i.d.r. public kein Rückgabewert auch nicht void, aber Parameter wie Methode Beispiel: Klasse Konto public Konto(int ktonr, double kapital) { this.ktonr = ktonr; saldo = kapital; 14
... Konstruktor Java definiert Default-Konstruktor Konstruktor ohne Paramter und "Funktionalität" public Konto() { // Default-Konstruktor Objekt kann ohne expliziten Konstruktor instanziert werden Konstruktoren der Oberklassen(später) werden automatisch aufgerufen 15
Methoden Methoden Zugriffsmodfikator: public oder private Zugriff auf Instanzvariablen (Zustand) - innerhalb Klasse "global" mehrere Methoden mit gleichen Namen möglich Überladen Beispiel - Voraussetzung: unterschiedliche Parameterlisten // methode 1 public void einzahlen(double betrag) { saldo += betrag; // methode 2 public void einzahlen() { saldo += 100; Aufruf einzahlen(1000); // methode 1 einzahlen(); // methode 2 16
public or private Kapselung(encapsulation) Objekt: Daten und Methoden zusammengefasst Geheimnisprinzip(information hinding) Objekt definiert klar definiert Schnittstelle nach aussen interne Daten (Attribute) werden versteckt - private Attribute speichern Zustand des Objekts Schnittstelle bei Objekten - public Methoden Zugang zu internen Daten - public Attribute vermeiden Schnittstelle Vertrag zwischen Implementator und Nutzer der Klasse (können verschiedene Personen sein) 17
... public or private Verstecken von Attributen Zugriff auf Variablen/Attribute nur über Methoden Regeln - alle Attribute als private deklarieren Vorteile - Veränderung ausschliesslich über Getter- / Setter-Methoden Namenskonvention: getxyz(), setxyz() - Interne bzw. lokale Methoden private für Anwender nicht sichtbar Daten / Zustand des Objektes bleibt konsistent vereinfacht Anwendung (keine Detailkenntnisse notwendig) Implementation kann jederzeit geändert werden 18
... public or private Beispiel Konto direkter Zugriff auf Saldo mit Getter-/Setter Methoden class Konto { private int ktonr; private double saldo;... public double getsaldo() { return saldo; public void setsaldo(double betrag) { saldo = betrag; 19
Klassenvariablen: static Klassenvariablen gehören zur Klasse, nicht zum Objekt - es gibt genau eine Kopie der Variable entsprechen globalen Variablen in anderen Sprachen Deklaration mit Schlüsselwort static Zugriff über Klassennamen Klassenname.xyz - es muss keine Instanz der Klasse existieren Beispiel Konto class Konto { public static String thebank = "Wintibank"; private double saldo = 0.0;... Zugriff System.out.println(Konto.theBank); 20
Klassenmethoden: static Klassenmethoden gehören zur Klasse, nicht zum Objekt es muss keine Instanz der Klasse erzeugt werden Zugriff auf Klassenvariablen und Klassemethoden möglich Einschränkung - kein Zugriff auf Instanzvariablen und Instanzmethoden Beispiel: Math Klasse double t; double sinvalue = Math.sin(2*Math.PI*t); double randomvalue = Math.random(); 21
Instanz vs. Klasse Instanzvariablen / - methoden Klassenvariablen / -methoden gehören zum jeweiligen Objekt eine Kopie pro Objekt gehören zur Klasse nur eine Kopie pro Klasse Instanzmethoden-Aufruf über Objektname Klassenmethoden-Aufruf über Klassenname Instanzariablen-Zugriff über Objektname Klassenvariablen-Zugriff über Klassenname Änderung einer Instanzvariablen sichtbar nur im aktuellen Objekt Änderung einer Klassevariablen sichtbar in allen Objekten Instanzvariablen / - methoden Aufruf nur wenn Objekt vorhanden Klassevariablen / - methoden kein Objekt (Instanz) notwendig 22
Klassen-Beziehung use Nutzungs-Beziehung: use Funktionalität einer anderen Klasse nutzen - ähnlich wie Module in C Beispiel: Bank und Konto Konto kto = new Konto(333, 200); double summe = abheben(100); UML Diagramm 1) Konto private...; Klasse Bank verwendet (use) Klasse Konto über Instanz von Konto Zugriff auf public: Instanzmethoden und -variablen Klassenmethoden und -variablen über Klasse Ball Zugriff auf public: Klassenmethoden und -variablen Methoden aus Konto in Bank: nicht überlad- und nicht überschreibbar use Bank... einzahlen(...) abheben(...)... 23 1) UML: Unified Modeling Language
Deklaration von Objektvariablen Deklaration von Objektvariablen legt (Referenz)-Variable vom Typ "Klassenname" an - Achtung das Objekt existiert noch nicht - Variable wird mit Referenz-Wert null initialisiert Beispiel: Klasse Konto Konto meinkonto; // Referenz auf Konto Objekt, = null Instanzierung(Erzeugung) mit new Objekt wird erzeugt und mit Konstruktor initialisiert "meinkonto" zeigt nun auf das Objekt Konto meinkonto; meinkonto = new Konto(260, 2000); Konto deinkonto = new Konto(333, 4000); 24
... Objektvariablen Objektevariablen Referenz-Datentypen verhalten sich anders als "normale" Variablen wie int, double,... Zuweisung kopiert nur Referenz beide zeigen auf das gleiche Objekt!!! keine Objektkopie!!! Konto meinkonto, daskonto; meinkonto = new Konto(2000, 260); daskonto = meinkonto; meinkonto daskonto Objekt Echte Kopie erstellen entweder selber ausprogrammieren fehleranfällig oder Clonable Interface implementieren später 25
... Objektvariablen Vergleich von Objekten nicht "==" verwenden falsch - vergleicht nur Referenzen jedes Objekt besitzt Methode equals() - muss aber ev. selber implementiert werden (Methode überschreiben Details später) @Override public boolean equals(object o) { Konto acnt = (Konto)o; // cast Object to Konto return (ktonr == acnt.getkontonr()); 26