34
Name: Patrick Förster, Michael Hasseler Programmieren in Java Strings & Einführung in die Objektorientierung - Klassen

Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

  • Upload
    buique

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Programmieren in Java

Strings & Einführung in die Objektorientierung - Klassen

Page 2: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

• Jede Methode wird eindeutig beschrieben durch ihre Signatur

• Zwei Methoden sind „gleich“, falls es folgende Übereinstimmung gibt

• Name der Methode

• Typ der Parameter

• Reihenfolge der Parameter

• Innerhalb eines Methoden-Scopes (== Klasse) kann es keine zwei Methoden mit „gleicher“

(im obigen Sinne) Signatur geben

Wiederholung (Methoden)

2 Programmieren in Java

( ) DATENTYP BEZEICHNER , …

optional

DATENTYP ,

static void test(int result, int expectedResult)

static int mult(int a, int b)

static int modulo(int a, int b)

static int neg(int value)

void test(int, int)

int mult(int, int)

int modulo(int, int)

int neg(int) Signatur

RÜCKGABETYP

Page 3: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

• Bei Methoden mit gleichem Namen aber verschiedenen Parametertypen spricht man von

Methoden-Überladung

1.Zuerst wird die Anzahl der Parameter abgeglichen

2.Dann die Typen der übergebenen Parameter auf Gleichheit verglichen

3.Falls keine Methodensignatur die nötigen Typen aufweist:

• Ist eine automatische Typumwandlung möglich, so dass die Parametertypen

übereinstimmen

• Die Methode mit der „größten Übereinstimmung“ wird aufgerufen

Wiederholung (Überladung)

3 Programmieren in Java

static int mult(int a, int b) …

static float mult(float a, float b) …

static double mult(double a, double b) …

static float mult(float a, int b) …

static int mult(int a, float b) …

static int mult(int a, int b, int c) …

mult(27, 37.0f)

static int mult(int a, int b) …

static float mult(float a, float b) …

static double mult(double a, double b) …

static float mult(float a, int b) …

static int mult(int a, float b) …

static int mult(int a, int b, int c) …

mult(27, 37L)

Page 4: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Wiederholung: new-Operator

• Beispiele

• Achtung:

• Arrays und Strings können in Java ohne explizites new erzeugt werden

• Im Falle von String ist dies sogar vorzuziehen

• Die Semantik des new-Operators:

• Reserviere Speicherplatz für einen Wert des angegebenen Datentyps

4 Programmieren in Java

int[] myArray = new int[] {0, 1, 1, 2, 3, 5, 8};

String myString = new String("HELLO WORLD");

Werte nicht-primitiver Datentypen müssen mit new erzeugt werden

Es gibt keine Möglichkeit primitive Daten mit new zu erzeugen

Page 5: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Strings

• 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

5 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

Page 6: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

• Jeder String „bringt“ automatische eine Reihe von Methoden mit

• Diese sind per Dereferenzierung mittels des .-Operators ansprechbar • Die Methode bezieht sich dabei auf den String, auf dem sie aufgerufen wurde

• Test, ob ein String einen bestimmten Teil-String enthält (contains)

• Um das Zeichen " innerhalb eines String verwenden zu können, muss dies mit einem

vorangestellten Backslash (\) „escaped“ werden

• Test ob Teil-String am Anfang (startsWith) oder Ende (endsWith)

String-Operationen

6 Programmieren in Java

String myString = "Hello World";

if (myString.contains("Hello")) System.out.println("\"Hello\" gefunden");

if (myString.startsWith("Hello")) System.out.println(myString + " startet mit \"Hello\"");

if (myString.endsWith("World")) System.out.println(myString + " endet mit \"World\"");

Page 7: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

• Index eines Teil-Strings ermitteln (indexOf, lastIndexOf)

• Teil-String kopieren (substring)

• Länge eines Strings (length)

String-Operationen (II)

7 Programmieren in Java

String myText2 = "Hello World, Hello World";

System.out.println(myText2.indexOf("World")); 6

System.out.println(myText2.lastIndexOf("World")); 19

int index = myText2.indexOf("World");

int lastindex = myText2.lastIndexOf("World");

System.out.println(myText2.substring(index, lastindex)); World, Hello

String myText3 = "";

if (myText3.length() == 0) System.out.println("Der String ist leer");

Page 8: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

• Unnötige Whitespaces am Anfang und Ende entfernen:

• Umwandeln in Klein- (toLowerCase) bzw. Großbuchstaben (toUpperCase)

• substring, trim, toLowerCase, toUpperCase ändern nicht den String sondern

liefern einen neuen!

• Einen String aufsplitten (split):

String myText4 = " Hello World ";

System.out.println(myText4); " Hello World "

System.out.println(myText4.trim()); "Hello World"

String-Operationen (III)

8 Programmieren in Java

String myText5 = "Hello World, Hello World";

String[] fragments = myText5.split(" ");

for (String fragment : fragments) System.out.println(fragment);

Hello

World,

Hello

World

System.out.println(myText4.toUpperCase().trim()); "HELLO WORLD"

System.out.println(myText4.trim().toLowerCase()); "hello world"

Page 9: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

• Zwei Strings vergleichen (equals)

• Warum equals und nicht den bekannten ==-Operator?

• Der ==-Operator vergleicht die Referenz, auf die der Pointer zeigt und nicht den Wert, der

an der referenzierten Speicherstelle liegt!

• Mit new erzeugt, wird auf jeden Fall neuer Speicherplatz angefordert • Implizit erzeugt, wird nur Speicherplatz angefordert, wenn der String zuvor noch nie in

genau gleicher Schreibweise benutzt wurde

Die implizite Variante ist in jedem Fall vorzuziehen!

String-Vergleich

9 Programmieren in Java

String string1 = "Hello World";

String string2 = "Hello World";

System.out.println(string1.equals(string2)); true

String string3 = new String("Hello World");

String string4 = new String("Hello World");

System.out.println(string1.equals(string2)); true

System.out.println(string1 == string2); true

System.out.println(string3.equals(string4)); true

System.out.println(string3 == string4); false

Page 10: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

10 Programmieren in Java

Page 11: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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“

11 Programmieren in Java

Page 12: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

• DVD + Brenner

• 2 x USB 2.0

• Creative Sound Blaster Z

• Radeon HD 7480

• Windows 8

12 Programmieren in Java

• iMac:

• 2.9 GHz Intel Core i5

• 8 GB DDR3 SDRAM

• 1000 GB Festplatte

• 3 x USB 2.0

• 2 x Thunderbolt

• Onboard Soundkarte

• NVIDIA GeForce GT 750M80

• OS X Yosemite1

Page 13: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Beispiel

13 Programmieren in Java

Dell

Prozessor: 4 GHz AMD Quad Core

RAM: 8 GB DDR3 SDRAM

Festplatte: 1500 GB

Opt. Laufwerk: DVD + Brenner

Anschlüsse: 2 x USB

Soundkarte: Creative Sound Blaster Z

Grafikarte: Radeon HD 7480

Betriebssystem: Windows 8

iMac

Prozessor: 2.9 GHz Intel Core i5

RAM: 8 GB DDR3 SDRAM

Festplatte: 1000 GB

Opt. Laufwerk: -

Anschlüsse : 3xUSB 2.0, 2xThunderbolt

Soundkarte: Onboard

Grafikkarte: NVIDIA GeForce GT 750M

Betriebssystem: OS X Yosemite

Computer

Prozessor

RAM

Festplatte

Opt. Laufwerk

Anschlüsse

Soundkarte

Grafikarte

Betriebssystem

INSTANZ

KLASSE

Page 14: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

14 Programmieren in Java

Page 15: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

15 Programmieren in Java

MODIFIKATOREN class {

}

BEZEICHNER

MODIFIKATOREN - | public | final

optional

public class BEZEICHNER {

}

Page 16: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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)

16 Programmieren in Java

new KLASSENBEZEICHNER ( )

new Computer()

new KLASSENBEZEICHNER ( ) KLASSENBEZEICHNER BEZEICHNER

Computer myComputer = new Computer();

Page 17: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

17 Programmieren in Java

Computer

Prozessor

RAM

Festplatte

Opt. Laufwerk

Anschlüsse

Soundkarte

Grafikarte

Betriebssystem

public class Computer {

String system;

}

DATENTYP BEZEICHNER ;

public { BEZEICHNER

}

class

Computer

Prozessor: String

RAM: int

Festplatte: int

Opt. Laufwerk: String

Anschlüsse: String[]

Soundkarte: String

Grafikarte: String

Betriebssystem: String

Page 18: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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"!

18 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

Page 19: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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:

19 Programmieren in Java

String someString = null;

Exception in thread "main" java.lang.NullPointerException

String[] someArray = new String[2];

System.out.println(someArray[0]);

null

Page 20: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

20 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();

Page 21: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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?)

21 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();

Page 22: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

22 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";

Page 23: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

23 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;

Page 24: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

24 Programmieren in Java

public class Computer {

private int ram;

public void setRam(int ram) {

if (ram < 4 || ram > 16) {

return ;

}

this.ram = ram;

}

}

Page 25: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Die Computer-Klasse

25 Programmieren in Java

Computer

Prozessor: String

RAM: int

Betriebssystem: String

Festplatte: int

Opt. Laufwerk: String

Anschlüsse: String[]

Soundkarte: String

Grafikarte: String

public class Computer {

private String processor;

private int ram;

private String system;

private int hd;

private String device;

private String[] connectors;

private String soundcard;

private String gfxCard;

public void setProcessor(String processor) …

public int getProcessor () …

public void setRam(int ram) …

public int getRam() …

public void setConnectors(String[] connectors) …

public int getConnectors() …

public void setGfxCard(String gfxCard) …

public int getGfxCard () …

}

Page 26: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

26 Programmieren in Java

Computer dell = new Computer();

dell.setProcessor("4 GHz AMD Quad Core");

dell.setRam(8);

dell.setHd(1500);

dell.setDevice("DVD + Brenner");

dell.setSoundcard("Creative Sound Blaster Z");

dell.setGfxCard("Radeon HD 7480");

dell.setSystem("Windows 8");

dell.setConnectors(new String[]{"USB", "USB"});

Computer iMac = new Computer();

iMac.setProcessor("2.9 GHz Intel Core i5");

iMac.setRam(8);

iMac.setHd(1000);

iMac.setDevice(null);

iMac.setSoundcard("Onboard");

iMac.setGfxCard("NVIDIA GeForce GT 750M");

iMac.setSystem("OS X Yosemite");

iMac.setConnectors(

new String[]{

"USB", "USB", "USB",

"Thunderbold", "Thunderbold"

}

);

Page 27: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

27 Programmieren in Java

public class Computer {

public Computer() {}

}

Computer dell = new Computer();

public class {

}

BEZEICHNER

public BEZEICHNER ( ) { }

Page 28: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

28 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");

Page 29: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

29 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

Page 30: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

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

30 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 += "Optical Device: " + this.device + "\n";

out += "Soundcard: " + this.soundcard + "\n";

out += "GfxCard: " + this.gfxCard + "\n";

out += „Connectors: ";

int i = 0;

for (String connector : this.connectors) {

out += connector;

if (++i != connectors.length) {

out += ", ";

}

}

out += "\n";

" Booting: " + this.system

System.out.println(out);

}

}

Page 31: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Der Weg zur Klasse

31 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

Page 32: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Aufgabe

• Aufgabe 1:

• Legen Sie ein neues Netbeans-Projekt an. • Fügen Sie die Klasse Schuh hinzu:

• Die Klasse soll folgende Eigenschaften besitzen:

• Farbe, Größe, Marke, istLinkerSchuh und eine Warennummer

• Implementieren Sie einen Konstruktor, der als Parameter die Farbe, die Größe, die

Marke und ob es der Linke Schuh ist, übergeben bekommt. Die Warennummer soll

bei jeder weiteren Instanz um 1 erhöht werden. • Fügen Sie der Klasse die Methode istGleich hinzu, die als Parameter einen

Schuh übergeben bekommt. Der übergebene Schuh soll mit dem aktuellen Schuh

(this) bzgl. der Attribute Farbe, Größe und Marke verglichen werden und true

liefern, falls diese identisch sind, andernfalls false. • Fügen Sie der Klasse die Methode ausgabe hinzu, welche die Attribute der

Instanz ausgibt, sodass damit die untere Konsolenausgabe erfolgt.

32 Programmieren in Java

Page 33: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Aufgabe

• Weiter zu Aufgabe 1: • Fügen Sie die Klasse Aufgabe_Schuh hinzu:

• Implementieren Sie in der Klasse die Methode vergleiche, die zwei Schuh-

Objekte als Parameter übergeben bekommt und diese mit der Methode istGleich

von der Klasse Schuh vergleicht. Fügen Sie der Methode Ausgabetext(e) hinzu,

sodass nachfolgende Ausgabe in der Konsole erscheint. • Schreiben Sie in der Klasse eine main-Methode, die nacheinander 4 Objekte des

Typs Schuh instanziiert und rufen Sie zu jedem Objekt die Methode ausgabe auf

und geben den Rückgabewert auf der Konsole aus.

• Rufen Sie 6 mal die Methode vergleiche mit den entsprechenden Schuhobjekten

auf, sodass folgende Ausgabe auf der Konsole erscheint:

33 Programmieren in Java

Page 34: Strings & Einführung in die Objektorientierung - Klassen · Name: Patrick Förster, Michael Hasseler •Jede Methode wird eindeutig beschrieben durch ihre Signatur Signatur •Zwei

Name: Patrick Förster, Michael Hasseler

Aufgabe

• Weiter zu Aufgabe 1:

• Tipp: Verwenden Sie für die Ermittlung der nächsten Warennummer eine statische

Variable vom Typ int in der Klasse Schuh.

34 Programmieren in Java