Upload
dangdat
View
216
Download
0
Embed Size (px)
Citation preview
Name: Patrick Förster, Michael Hasseler
Programmieren in Java
Einführung in die Objektorientierung – Klassen & Objekte
Name: Patrick Förster, Michael Hasseler
• Statisch:
• Bei erneuter statischer Zuweisung:
• Dynamisch
In jedem Fall muss eine Größe angeben werden
• Entweder explizit (dynamisch) oder implizit (statisch) durch Angabe aller Werten
Wiederholung (Arrays initialisieren)
2 Programmieren in Java
int[] firstSevenFibonacci = {0, 1, 1, 2, 3, 5, 8};
BASISDATENTYP Bezeichner [] = ; { } WERT , WERT , …
WERT DATENTYP
int[] firstSevenFibonacci = new int[7];
BASISDATENTYP Bezeichner [] = ; new BASISDATENTYP [ SIZE ]
Bezeichner = ; { } WERT , … new BASISDATENTYP [ ]
firstSevenFibonacci = new int[] {9, 10, 11, 12, 13, 14, 15};
Name: Patrick Förster, Michael Hasseler
Wiederholung (Arrays lesen und schreiben)
• Ein dynamisch erzeugter Array ist leer • Setzen/Lesen von Elementen erfolgt über den []-Operator (Index-Operator)
• Achtung: Die Indexmenge beginnt immer bei 0
• Wenn der Compiler automatisch (Coercion) umwandeln kann, tut er dies
• Setzen eines Wertes:
• Lesen eines Wertes
3 Programmieren in Java
int[] firstSevenFibonacci = new int[7];
firstSevenFibonacci[0] = 10;
firstSevenFibonacci[3] = 999;
firstSevenFibonacci[6] = 3;
VARIABLE [ INDEX ] = ; WERT|AUSDRUCK BASISDATENTYP
int[] firstSevenFibonacci = {0, 1, 1, 2, 3, 5, 8};
firstSevenFibonacci[0] 0
firstSevenFibonacci[3] 2
firstSevenFibonacci[6] 8
VARIABLE [ INDEX ]
Name: Patrick Förster, Michael Hasseler
• String ist in Java ein zusammengesetzter Datentyp
• Variablen vom Typ String sind demnach Pointer
• D.h. String-Werte müssen per new erzeugt werden:
• Analog zu Arrays gibt es eine new-lose implizite Erzeugung:
• String ist in Java der einzige nicht numerische und nicht primitive Datentyp, für den der
Operator + definiert ist:
• Sobald ein Operand von Typ String ist, werden alle automatisch umgewandelt
Wiederholung (Strings)
4 Programmieren in Java
STRING String Bezeichner = " " ;
String String Bezeichner = new ( ) STRING " " ;
String myString = new String("Hello World");
String myString = "Hello World";
String hello = "Hello";
String world = "World";
System.out.println(hello + " " + world); Hello World
Name: Patrick Förster, Michael Hasseler
Prozedurale Programmierung
• Bisher: Klassische prozedurale Programmierung
• Java ist allerdings eine objektorientierte Sprache
• Rein prozedurale Programmierung daher umständlich:
• Umschließende Klasse ohne logischen Zusammenhang
• Keine Möglichkeit der logischen Zusammenfassung von Methoden
• Beides könnte aufgelöst werden, in dem Klassen als „statische Module“ genutzt
werden
• Was allerdings das Konzept einer Klasse durchbricht
Daher prozedurale Programmierung in Java nicht erstrebenswert
5 Programmieren in Java
Name: Patrick Förster, Michael Hasseler
Objektorientierte Programmierung
• Wir denken in Objekten • Jeder Gegenstand, jedes Lebewesen hat bestimmte Eigenschaften
• Jeder Gegenstand, jedes Lebewesen hat bestimmte Fähigkeiten
• Jeder Gegenstand, jedes Lebewesen hat einen bestimmten Nutzen
• Objektorientierte Programmierung:
• Programmatische Problemstellung auf ein natürliches Konzept reduzieren
• Schwierigkeiten:
• Wie identifiziert man Objekte in einem Problem
• Einfacher, wenn die Problemstellung „reale“ Gegenstände enthält
• Wie stehen Objekte in Verbindung
• „Wer macht was“
6 Programmieren in Java
Name: Patrick Förster, Michael Hasseler
• Computer Hardware
• Die Hardware soll als Software, also als Programm abgebildet werden
• Der Computer selbst ist schnell als Objekt identifiziert
Beispiel
• Dell:
• 4 GHz AMD Quad-Core
• 8 GB DDR3 SDRAM
• 1500 GB Festplatte
• Windows 8
• …
7 Programmieren in Java
• iMac:
• 2.9 GHz Intel Core i5
• 8 GB DDR3 SDRAM
• 1000 GB Festplatte
• OS X Yosemite1
• …
Name: Patrick Förster, Michael Hasseler
Beispiel
8 Programmieren in Java
Dell
Prozessor: 4 GHz AMD Quad Core
RAM: 8 GB DDR3 SDRAM
Festplatte: 1500 GB
Betriebssystem: Windows 8
iMac
Prozessor: 2.9 GHz Intel Core i5
RAM: 8 GB DDR3 SDRAM
Festplatte: 1000 GB
Betriebssystem: OS X Yosemite
Computer
Prozessor
RAM
Festplatte
Betriebssystem
INSTANZ
KLASSE
Name: Patrick Förster, Michael Hasseler
Klassen
• In der Objektorientierung dienen Klassen als Blaupause für Objekte
• Eine Klasse beschreibt
• die Eigenschaften eines Objektes
• die Fähigkeiten eines Objektes
• Ein konkretes Objekt wird als Instanz einer Klasse bezeichnet
• Die Instanz legt die konkreten Werte der Eigenschaften fest
• Auf Basis dieser Werte unterscheiden sich die Fähigkeiten der Instanz
• Jede Instanz hat ihr eigenes Set an Werten und nur die eigenen Werte können geändert
werden
• Man kann demnach sagen:
• Jede Instanz ist zusammengesetzt aus Werten für die einzelnen Eigenschaften
• Damit ist jede Klasse eine zusammengesetzter Datentyp
9 Programmieren in Java
Name: Patrick Förster, Michael Hasseler
Definition einer Klasse in Java
• Die Datei in der die Klasse definiert wird, muss BEZEICHNER.java heißen
• Die Modifikatoren sind optional, vorerst aber immer: public
• public: Jeder darf Instanzen dieser Klasse erzeugen
10 Programmieren in Java
MODIFIKATOREN class {
}
BEZEICHNER
MODIFIKATOREN - | public | final
optional
…
public class BEZEICHNER {
…
}
Name: Patrick Förster, Michael Hasseler
Klasse in NetBeans hinzufügen 1/2
• Im Projektbaum mit rechter Maustaste das Projekt anklicken
11 Programmieren in Java
Name: Patrick Förster, Michael Hasseler
Klasse in NetBeans hinzufügen 2/2
• Im Feld Class Name den Klassennamen angeben, hier z. B. Computer
12 Programmieren in Java
Name: Patrick Förster, Michael Hasseler
Objekt-Variablen
• Jede Klasse definiert einen neuen zusammengesetzten Datentyp • Daher müssen Werte (Instanzen) dieses Datentyps mit new erzeugt werden
• Instanzen sind damit immer auf dem Heap abgelegt
• Default-Erzeugung einer Instanz:
• Natürlich können Variablen (Pointer) auf Basis einer Klasse definiert werden
• Es bleibt:
• Die Variable kann nur Werte aufnehmen, die vom Typ der Definition sind
• Die Variable myComputer muss daher immer auf eine Instanz der Klasse Computer
verweisen (oder auf null)
13 Programmieren in Java
new KLASSENBEZEICHNER ( )
new Computer()
new KLASSENBEZEICHNER ( ) KLASSENBEZEICHNER BEZEICHNER
Computer myComputer = new Computer();
Name: Patrick Förster, Michael Hasseler
Objekt-Attribute
• Im Eingangsbeispiel wurde von den konkreten Beschreibungen auf die Klasse Computer
geschlossen
• Eine Eigenschaft ist eine Variable, deren Scope die Klasse ist:
• Die Eigenschaften müssen also noch auf „passende“ Typen gemappt werden
14 Programmieren in Java
Computer
Prozessor
RAM
Festplatte
Betriebssystem
public class Computer {
String system;
…
}
DATENTYP BEZEICHNER ;
public { BEZEICHNER
}
…
class
Computer
Prozessor: String
RAM: int
Festplatte: int
Betriebssystem: String
Name: Patrick Förster, Michael Hasseler
Objekt-Attribute (II)
• Der Zugriff auf ein Objekt-Attribut erfolgt immer über eine Variable
• Wie bereits gesehen, sind Instanzen immer „Heap-Werte“
• Ein Attribut ist dabei ein Wert an einer bestimmten Stelle im Speicherbereich der Instanz,
die über den Attributnamen zugreifbar ist
• Analog: Zugriff auf ein bestimmtes Array-Element über seinen Index
• Der Zugriff muss also per Dereferenzierung erfolgen
• Ein Zugriff auf currentSystem würde zu null auswerten
• Das Objekt-Attribut wurde bisher nur definiert, aber nie initialisiert
• Eine Initialisierung kann bereits bei der Definition erfolgen
• Jede Instanz hat damit als Defaultwert für system den Wert "Windows 8"!
15 Programmieren in Java
public class Computer {
String system;
}
Computer myComputer = new Computer();
String currentSystem = myComputer.system;
public class Computer {
String system = "Windows 8";
}
Computer pc = new Computer();
Computer iMac = new Computer();
pc.system.equals(iMac.system) true
Name: Patrick Förster, Michael Hasseler
Der null-Pointer
• Pointer-Variablen, denen keine Referenz zugewiesen ist, haben den speziellen Wert null
(Schlüsselwort)
• Der Wert kann explizit zugwiesen werden
• Wird versucht diese Variable zu Dereferenzieren so kommt es zum Fehler:
• Insbesondere werden nicht primitive Arrays mit null-Werte initialisiert:
16 Programmieren in Java
Computer myComputer = null;
Exception in thread "main" java.lang.NullPointerException
String[] someArray = new String[2];
System.out.println(someArray[0]);
null
Name: Patrick Förster, Michael Hasseler
• Der Modifikator static:
• Mit: zur Klasse gehörig
• Ohne: zur Instanz gehörig Kein static bei Objekt-Methoden
• Die Methode kann nur per Deferenzierung einer Instanz aufgerufen werden
• Der Modifikator public:
• Jeder darf die Methode aufrufen
Vorerst jede Methode public
Objekt-Methoden
17 Programmieren in Java
optional
public { RÜCKGABETYP ( )
}
SATZ; | BLOCK
DATENTYP BEZEICHNER PARAM-
BEZEICHNER
, …
return AUSDRUCK ;
optional
public class Computer {
public void doSomething() {…}
}
Computer pc = new Computer();
pc.doSomething();
Name: Patrick Förster, Michael Hasseler
Das Schlüsselwort: static
• Angenommen man würde die Methode doSomething mit static definieren:
• Die IDE (oder genauer: der Compiler) wird sofort monieren:
• Eine statische Methode hat keinen Zugriff auf Objekt-Attribute
• Sie gehört “zur Klasse” nicht aber zur Instanz
• Der Zugriff erfolgt daher auch direkt über die Klasse:
• Die main-Methode ist daher static (wer sollte die nötige Instanz erzeugen?)
18 Programmieren in Java
public class Computer {
String system = "Windows 8";
public static void doSomething() {
System.out.println("I like: " + system);
}
}
non-static variable “system” cannot be referenced from a static context
Computer.doSomething();
Name: Patrick Förster, Michael Hasseler
Das Schlüsselwort: this
• Objekt-Attribute können innerhalb einer Methode überdeckt werden
• Der Zugriff auf ein Attribut erfolgt immer über seine Instanz
• Dies ist auch innerhalb eines Objektes der Fall, allerdings implizit
• Der Compiler überprüft zuerst, ob eine Variable lokal definiert wurde
• Falls nicht, überprüft er ob ein „passendes“ Objekt-Attribut existiert • Falls ja, wird implizit der Variablenaufruf um das Schlüsselwort this ergänzt
• this ist ein spezieller Pointer, der immer auf die aktuelle Instanz verweist
• Besser ist es den Zugriff auf Attribute immer explizit mit this zu schützen
19 Programmieren in Java
public class Computer {
String system = "Windows 8";
public void doSomething() {
String system = "Linux";
System.out.println(" I like: " + system);
}
}
Computer pc = new Computer();
pc.doSomething();
"I like: Linux";
public void doSomething() {
String system = "Linux";
System.out.println("I like: " + this.system);
}
Computer pc = new Computer();
pc.doSomething();
"I like: Windows 8";
Name: Patrick Förster, Michael Hasseler
• Meist ist eine enge Kapselung von Attribut und Instanz erstrebenswert:
• Attribute sollten nur durch die zugehörige Instanz geändert/gelesen werden
• Bislang ist ein Attribut allerdings auch von außen änder- bzw. lesbar • Der Modifikator private definiert, dass ein Attribut nur noch von der eigenen Instanz
geändert bzw. gelesen werden kann
• Der Zugriff und das Ändern erfolgt dann über zwei Methoden:
• set/get + uppercase(A) + ttributename
• Setter: Setzten eines neuen Wertes
• Getter: Lesen des Attributes
Attribut-Kapselung
20 Programmieren in Java
public class Computer {
private int ram;
public void setRam(int ram) {
this.ram = ram;
}
public int getRam() {
return this.ram;
}
}
public class Computer {
private int ram;
}
Computer myComputer = new Computer();
int currentRam = myComputer.ram;
Name: Patrick Förster, Michael Hasseler
Warum?
• Das Attribut gehört zur Instanz, also soll auch die Instanz die Kontrolle haben
• Kapselung macht ein Attribut resistent vor
• invaliden Werten: Die Instanz kann vor dem Setzen über den Setter den Wert validieren
und ggfs. „ablehnen“
• Änderung der internen Repräsentation
• Definierter Datentyp stellt sich intern als ungeeignet dar
• Änderung möglich, das Attribut gekapselt
• Getter/Setter-Typ bleibt allerdings beim „alten“ Typ
21 Programmieren in Java
public class Computer {
private int ram;
public void setRam(int ram) {
if (ram < 4 || ram > 16) {
return ;
}
this.ram = ram;
}
}
Name: Patrick Förster, Michael Hasseler
Von außen, von innen
22 Programmieren in Java
• Der Scope einer Instanzvariablen legt die Zugriffsberechtigungen auf Methoden und
Attribute der Instanz fest
• Der Scope von pc ist die Methode main, deren Scope die Klasse Main
• Das Attribut processor wird als private deklariert
• Es kann daher nur innerhalb der Klasse Computer dereferenziert werden
• Die Zuweisung von außen (temp1) ist damit nicht möglich
• Die Methode getProcessor ist public
• Sie kann „von überall“ also auch von außen (main) aufgerufen werden
• Die Zuweisung temp2 ist damit erlaubt
public class Main {
public static void main(String[] args) {
Computer pc = new Computer(
"4 GHz AMD Quad Core"
);
String temp1 = pc.processor;
String temp2 = pc.getProzessor();
}
}
public class Computer {
private String processor;
public Computer (String processor) {
this.processor = processor;
}
public String getProcessor() {
return this.processor;
}
}
Name: Patrick Förster, Michael Hasseler
Die Computer-Klasse
• „Quellcode-Konvention“ in der Java-Entwicklung:
• Klassennamen werden groß geschrieben
• Attributnamen werden klein geschrieben
• Objekt- und Klassenmethodennamen werden klein geschrieben
• Zweite Wort in einem Namen wird groß beginnend angefangen
23 Programmieren in Java
Computer
Prozessor: String
RAM: int
Festplatte: int
Betriebssystem: String
public class Computer {
private String processor;
private int ram;
private int hd;
private String system;
public void setProcessor(String processor) …
public int getProcessor () …
public void setRam(int ram) …
public int getRam() …
…
}
Name: Patrick Förster, Michael Hasseler
Die Computer-Klasse
• Nun da die Attribute der Computer-Klasse identifiziert, typisiert und implementiert wurden,
können die konkreten Instanzen erstellt werden:
• Die Instanziierung erfolgt in der main-Methode
• Für die main-Methode sollte eine neue Klasse erstellt werden
• Diese sollte lediglich die main-Methode enthalten
24 Programmieren in Java
Computer dell = new Computer();
dell.setProcessor("4 GHz AMD Quad Core");
dell.setRam(8);
dell.setHd(1500);
dell.setSystem("Windows 8");
Computer iMac = new Computer();
iMac.setProcessor("2.9 GHz Intel Core i5");
iMac.setRam(8);
iMac.setHd(1000);
iMac.setSystem("OS X Yosemite");
Name: Patrick Förster, Michael Hasseler
Konstruktoren
• Im Beispiel werden iMac und dell über die Setter-Methoden initialisiert
• Diese Initialisierung basiert allerdings rein auf „gutem Willen“
• Einzelne Setter-Aufrufe können weggelassen werden
• Syntaktisch ist dies kein Problem, aber evtl. semantisch
• Um im Bild zu bleiben: Ein Computer benötigt einen Prozessor • Ein Konstruktor ist eine spezielle Methode zur Initialisierung einer Instanz
• Per Default besitzt jede Klasse implizit den „leeren Konstruktor“ • Ein Konstruktor wird automatisch beim Erzeugen mit new aufgerufen
• Ein Konstruktor muss so heißen wie seine Klasse • Ein Konstruktor hat keinen Rückgabewert und damit also auch kein return
25 Programmieren in Java
public class Computer {
public Computer() {}
}
Computer dell = new Computer();
public class {
}
BEZEICHNER
…
public BEZEICHNER ( ) { }
Name: Patrick Förster, Michael Hasseler
Konstruktoren (II)
• Die Anzahl an Konstruktoren ist beliebig (Überladung von Methoden)
• Sobald ein eigener Konstruktor definiert wurde, ist eine Instanz nicht mehr über den
Default-Konstruktor erzeugbar
• Stattdessen muss mit der Erzeugung genau ein Konstruktor erfüllt werden • Die Erzeugung ist demnach nichts weiter als new + Methodenaufruf
• Wobei die Methode ein Konstruktor sein muss
• So kann die Initialisierung bestimmter Attribute sichergestellt werden
26 Programmieren in Java
public class Computer {
public Computer (String processor, int ram, String system) {
this.processor = processor;
this.ram = ram;
this.system = system;
}
…
}
Computer dell = new Computer();
Computer dell = new Computer("4 GHz AMD Quad Core");
Computer dell = new Computer("4 GHz AMD Quad Core", 8, "Windows 8");
Name: Patrick Förster, Michael Hasseler
Funktionalität
• Die Eigenschaften eines Computers werden als Attribute definiert
• Bisher ist jede Computer-Instanz lediglich ein „Daten-Container“ • Solche Instanzen werden POJOs genannt (Plain Old Java Object)
• Wieder im Bild: Ein Computer ist mehr als nur seine Bestandteile
• Zumindest wird man einen Computer an und ausschalten können
• Diese Fähigkeiten sollten in der Klasse verankert werden:
• Die Methoden wurden in Abhängigkeit der Objekt-Attribute definiert
• Die Attribute bestimmen das Verhalten der Methode
27 Programmieren in Java
public class Computer {
…
public void on() {
System.out.println("Booting: " + this.system);
}
public void off() {
System.out.println("Shutdown: " + this.system);
}
…
}
Computer dell = new Computer(
"4 GHz AMD Quad Core", 8, "Windows 8"
);
dell.on(); // Botting: Windows 8
dell.off(); // Shutdown: Windows 8
Computer iMac = new Computer(
"2.9 GHz Intel Core i5", 8,
"OS X Yosemite"
);
iMac.on(); // Botting: OS X Yosemite
iMac.off(); // Shutdown: OS X Yosemite
Name: Patrick Förster, Michael Hasseler
Funktionalität II
• Die Eigenschaften eines Computers sollen ausgegeben werden können
• Die Methode print soll diese Funktionalität kapseln
28 Programmieren in Java
public class Computer {
…
public void print() {
String out = "";
out += "Operating System: " + this.system + "\n";
out += "Processor: " + this.processor + "\n"
out += "RAM: " + this.ram + " GB\n";
out += "HD: " + this.hd + " GB\n";
out += "Power: " + this.power + "\n"
System.out.println(out);
}
…
}
Name: Patrick Förster, Michael Hasseler
Der Weg zur Klasse
29 Programmieren in Java
Analyse
Klassen identifizieren
Attribute identifizieren
Attribute typisieren
Attribute kapseln
Konstruktoren festlegen
Funktionalität identifizieren
Methoden definieren
Neue Funktionalität
kann zu neuen
Attributen führen
Typisierung kann zu neuen
Klassen führen
Neue Klassen können eine erneute Analyse erfordern
Name: Patrick Förster, Michael Hasseler
Zusammenfassung
• Sie können eine Klasse in Java schreiben, die
• Attribute besitzt
• Konstruktor(en) hat
• Methoden hat
• Sie kennen die Bedeutung der Zugriffsmodifizierer private und public
• Sie kennen den Unterschied und die aufrufweise von Klassen- und Objektattributen
bzw. -methoden
• Sie können ein Objekt einer Klasse instanziieren
30 Programmieren in Java
Name: Patrick Förster, Michael Hasseler
Aufgaben
• Aufgabe 1.)
• Legen Sie ein neues Netbeans-Projekt an. • Fügen Sie die Klasse Person hinzu:
• Die Klasse soll folgende Eigenschaften vom Typ String und privat im Zugriff
haben: Vorname, Nachname, Geburtsort, Geburtsdatum
• Implementieren Sie einen Konstruktor, der als Parameter den Vornamen, den
Nachnamen, den Geburtsort und das Geburtsdatum für die Initialisierung übergeben
bekommt. • Fügen Sie der Klasse die Methode ausgabe hinzu, welche die Attribute der
Instanz ausgibt. • Schreiben Sie in der Klasse Main eine main-Methode, die nacheinander 4 Objekte
des Typs Person instanziiert und rufen Sie zu jedem Objekt die Methode ausgabe
auf, sodass die Ausgabe wie die ersten 4 Zeilen des letzten Folie entspricht. (Tipp: Im
Computer-Beispiel im Internet zur Vorlesung 6 finden Sie die Attribute nummer und
maxNummer, die Sie für die Nummerierung der Personen wiederverwenden können)
31 Programmieren in Java
Name: Patrick Förster, Michael Hasseler
Aufgaben
• Aufgabe 2.) • Fügen Sie der Klasse Person die Methode istGleich hinzu, die einen Parameter
vom Typ Person übergeben bekommt. Die übergebene Person soll mit der aktuellen
Person (this) bzgl. der Attribute Vorname, Nachname, Geburtsort und Geburtsdatum
verglichen werden. Falls alle Daten identisch sind, liefert die Methode true, sonst false. • Implementieren Sie in der Klasse Main die Methode vergleiche, die zwei Objekte
vom Typ Person als Parameter übergeben bekommt. Diese nutzt die Methode
istGleich von der Klasse Person zum Vergleichen. Fügen Sie der Methode
vergleiche Ausgabetext(e) hinzu, die ausgibt, ob die beiden Objekte identisch oder
unterschiedlich sind. • Rufen Sie 6 mal die Methode vergleiche mit den entsprechenden Objekten vom
Typ Person auf, sodass die Ausgabe in der Konsole um die letzten 6 Zeilen der letzten
Folie erweitert wird: • Bedingung: Der Zugriff auf die Attribute der Klasse Person soll weiterhin gekapselt
bleiben.
32 Programmieren in Java
Name: Patrick Förster, Michael Hasseler
Aufgaben
33 Programmieren in Java