57
EINFÜHRUNG IN DIE PROGRAMMIERUNG Tobias Witt 25.03.2014 OBJEKTORIENTIERTES PROGRAMMIEREN

Einführung in die Programmierung - cs.hhu.de · package de.hhu.propra.examples.wurmclass; Packagename Eindeutiger Name: de.hhu.propra.examples.wurmclass.Wurm public class Wurm {public

Embed Size (px)

Citation preview

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Tobias Witt

25.03.2014

OBJEKTORIENTIERTES PROGRAMMIEREN

• 10:30 - 12:00

• Täglich Übungen zur Vertiefung

• Laptop hier nicht erforderlich

‣ Aber in den Übungen!

• Linux, OS X

‣ http://hhu-fscs.de/linux-install-party/

KLASSEN UND OBJEKTE

WURM & WAFFE

• Wurm

‣ Variablen: leben, team, wa#e

‣ Methoden: wa#eAbfeuern(), schadenErleiden(int schaden)

• Wa"e

‣ Variablen: munition, schaden

‣ Methoden: feuer()

WURMpublic class Wurm { public int leben; private int team;

private Waffe waffe;

public Wurm(Waffe waffe, int leben, int team) { this.waffe = waffe; this.leben = leben; this.team = team; }

public int waffeAbfeuern() { return waffe.feuer(); }

public void schadenErleiden(int schaden) { leben = Math.max(0, leben - schaden); } }

Wurm.java

Konstruktor

Instanzvariablen (Member)

„this object“

WAFFEpublic class Waffe { private int munition; private static final int schaden = 100;

public Waffe(int munition) { this.munition = munition; }

public int feuer() { if (munition > 0) { munition--; return schaden; } else { return 0; } } }

Waffe.javaKlassenvariable

SPIEL

public class Spiel { public static void main(String[] args) { Waffe waffe1 = new Waffe(25); Waffe waffe2 = new Waffe(6); Wurm wurm1 = new Wurm(waffe1, 100, 1); Wurm wurm2 = new Wurm(waffe2, 150, 2);

wurm1.schadenErleiden(wurm2.waffeAbfeuern());

System.out.println(wurm2.leben); } }

Spiel.java

Instanz (= Objekt)Typ (= Klasse) Konstruktor der Klasse

KLASSEN VS. OBJEKTE

• new erzeugt Instanz oder Objekt von Klasse

• Objekt:

‣ Identität (Name bzw. Id)

‣ Zustand (Variablen bzw. Member)

‣ Verhalten (Methoden)

SPEICHER

• int a = 5;

• int b = 4;

4

5

SPEICHER

• int c = a + b;

• String d = "hallo";

9

0x#aca

SPEICHER

"hallo"

9

0x#aca

PRIMITIVE DATENTYPEN VS. OBJEKTE

• Primitiv: Werte auf dem Stack

‣ pass by value

• Objekte: Referenz auf dem Stack, Werte im Heap

‣ pass by reference

‣ Primitive Member: im Speicher-Bereich des Objekts

• Vorsicht final:

‣ Referenz konstant, Member nicht

void eineMethode(int schaden) { schaden = 20; }

void eineMethode(Wurm wurm) { wurm.leben = 10; }

int schaden = 100; Wurm wurm = new Wurm(waffe, 100, 1);

eineMethode(schaden); eineMethode(wurm);

schaden >> 100 wurm.leben >> 10

Kopie des Wertes

Kopie der Referenz

KLASSENVARIABLEN VS. INSTANZVARIABLEN

public class Waffe { public static int schaden1 = 100; public int schaden2 = 200; }

Waffe w1 = new Waffe(); Waffe w2 = new Waffe();

w1.schaden2 = 300 >> 300 w2.schaden2 >> 200 w2.schaden2 = 70 >> 70 w1.schaden2 >> 300 w1.schaden1 = 0 >> 0 w2.schaden1 >> 0 Waffe.schaden1 = 500 >> 500 w1.schaden1 >> 500 w2.schaden1 >> 500

Unschön

public class Waffe { public static int schaden1 = 100; public int schaden2 = 200; }

Waffe w1 = new Waffe(); Waffe w2 = new Waffe();

KLASSENVARIABLEN VS. INSTANZVARIABLEN

public class Waffe { public static int schaden1 = 100; public int schaden2 = 200; }

Waffe w1 = new Waffe(); Waffe w2 = new Waffe();

Klassenvariable

Instanzvariable

DIE MAIN-METHODE

public class HalloWelt { public static void halloWelt() { System.out.println("Hallo Welt"); }

public static void main(String[] args) { halloWelt(); } }

DIE MAIN-METHODE

public class HalloWelt { public void halloWelt() { System.out.println("Hallo Welt"); }

public static void main(String[] args) { halloWelt(); } }

non-static field cannot be referenced from a static context

NULL-TYP

• Wert einer nicht primitiven, nicht initialisierten

Variable

• Äquivalent mit „Nichts“

• Verschieden von 0 (0 ist nicht null)

KONVENTIONEN

• Klassennamen groß: MeineKlasse

‣ public class MeineKlasse muss in Datei MeineKlasse.java

• Variablen- und Methodennamen klein: meineVariable

• Ausnahmen selten (z.B. System.out)Innere Klasse

KONVENTIONEN ENGLISCH VS. DEUTSCH

• Auf diesen Folien: Deutsch

‣ Nur zur besseren Lesbarkeit für den Kurs!!!

• Bitte in der echten Programmierung grundsätzlich

Englisch!

‣ Probleme mit Umlauten und ß vorprogrammiert

PACKAGES

package de.hhu.propra.examples.wurmclass; PackagenameEindeutiger Name: de.hhu.propra.examples.wurmclass.Wurmpublic class Wurm {

public int leben; private int team;

private Waffe waffe;

public Wurm(Waffe waffe, int leben, int team) { this.waffe = waffe; this.leben = leben; this.team = team; }

public int waffeAbfeuern() { return waffe.feuer(); }

public void schadenErleiden(int schaden) { leben = Math.max(0, leben - schaden); } }

package de.hhu.propra.examples.wurmclass;

public class Spiel { public static void main(String[] args) { Waffe waffe1 = new Waffe(25); Waffe waffe2 = new Waffe(7); Wurm wurm1 = new Wurm(waffe1, 100, 1); Wurm wurm2 = new Wurm(waffe2, 100, 2);

wurm1.schadenErleiden(wurm2.waffeAbfeuern());

System.out.println(wurm1.leben); } }

gleiches Package

einfacher Name sichtbar

package de.hhu.propra.examples;

public class Spiel { public static void main(String[] args) {

//... de.hhu.propra.examples.wurmclass.Wurm wurm1... //... wurm1.schadenErleiden(wurm2.waffeAbfeuern());

System.out.println(wurm1.leben); } }

anderes Package

vollständiger Name notwendig

package de.hhu.propra.examples;

import de.hhu.propra.examples.wurmclass.Wurm;

public class Spiel { public static void main(String[] args) { //... Wurm wurm1 = new Wurm(waffe1, 100, 1); wurm1.schadenErleiden(wurm2.waffeAbfeuern());

System.out.println(wurm1.leben); } }

anderes Package

Name importiert

einfacher Name sichtbar

PACKAGES & ORDNER

KOMPILIEREN UND AUSFÜHREN II

$ ls de/hhu/propra/examples/wurmclass Spiel.java Wurm.java Waffe.java $ javac de/hhu/propra/examples/wurmclass/*.java $ ls de/hhu/propra/examples/wurmclass Spiel.java Spiel.class Wurm.java Wurm.class Waffe.java Waffe.class $ java de.hhu.propra.examples.wurmclass.Spiel 0

VERERBUNG

WURM & WAFFE

• Gemeinsamkeiten:

‣ Gra"sche Darstellung

‣ Kollision

‣ Namen

LÖSUNG?

public class Wurm { private String name; private Image image;

private void kollidiere() { //... } }

public class Waffe { private String name; private Image image;

private void kollidiere() { //... } }

LÖSUNG!

public class SpielObjekt { protected String name; protected Image image;

public SpielObjekt(String name, Image image) { this.name = name; this.image = image; }

private void kollidiere() { } }

LÖSUNG!

public class Wurm extends SpielObjekt { public Wurm(String name, Image image) { super(name, image); } }

public class Waffe extends SpielObjekt { public Waffe(Image image) { super("Waffe", image); } }

LÖSUNG!

public class Wurm extends SpielObjekt { public Wurm(String name, Image image) { super(name, image); } }

public class Waffe extends SpielObjekt { public Waffe(Image image) { super("Waffe", image); } }

POLYMORPHIE

public class BeweglichesSpielObjekt extends SpielObjekt { public BeweglichesSpielObjekt(String name, Image image) { super(name, image); }

@Override private void kollidiere() { //.. geh nicht durch die Wand }

private void bewege() { } }

WURM & SPIEL

public class Wurm extends BeweglichesSpielObjekt { public Wurm(String name, Image image) { super(name, image); } }

public class Spiel { public static void main(String[] args) { Image imageHeinrich = new Image(); SpielObjekt heinrich = new Wurm("Heinrich", imageHeinrich); } }

Waffe Rüstung Bonus

Spielobjekt

Wurm Item

Bazooka Shotgun Gürtel Doppelter Schaden

Projektil

Object

OBJEKTE AUSGEBEN

• Was macht System.out.println(wurm)?

‣ wurm.toString();

• Standardimplementierung: Objekt-ID

• Überschreiben für spezielle Ausgabe

SICHTBARKEIT

Sichtbarkeit Schlüsselwort

Sichtbar für alle public

Sichtbar nur innerhalb der Klasse private

Sichtbar für Klasse und alle erbenden Klassen und innerhalb des Packages

protected

Sichtbar innerhalb des packages -

package1 package2

KlasseA

KlasseB

SubKlasseA1

SubKlasseA2

KlasseC

private protected - public

KlasseA ✔ ✔ ✔ ✔SubKlasseA1 ✘ ✔ ✔ ✔

KlasseB ✘ ✔ ✔ ✔SubKlasseA2 ✘ ✔ ✘ ✔

KlasseC ✘ ✘ ✘ ✔

Auf welche Member in KlasseA können die anderen Klassen zugreifen?

CASTING & GENERICS

CASTING

CASTING

• Implizites Casting von kleinem Typ zu großem

Typ

• Kein Verlust von Informationen

int a = 1; float b = a;

SpielObjekt wurm = new Wurm("Heinrich");

float a = 1.5; int b = (int) a;

SpielObjekt[] objekte = { new Wurm("Heinrich"), new Waffe(100) };

Wurm heinrich = (Wurm) objekte[0]; Waffe bazooka = (Waffe) objekte[1];

CASTING

• Explizites Casting von großem Typ zu kleinem Typ

• Verlust von Informationen möglich

cast-Operator

GENERISCHE TYPEN

public class Liste1 { private SpielObjekt[] data;

public Liste1(int anzahl) { data = new SpielObjekt[anzahl]; }

public SpielObjekt getAt(int index) { return data[index]; } }

GENERISCHE TYPEN

public class Liste2<T extends SpielObjekt> { private T[] data;

public Liste2(int anzahl) { data = new T[anzahl]; }

public T getAt(int index) { return data[index]; } }

GENERISCHE TYPEN ANWENDUNG

public class Spiel { public static void main(String[] args) { Liste1 liste1 = new Liste1(10); Wurm wurm1 = (Wurm) liste1.getAt(1);

Liste2<Wurm> liste2 = new Liste2<>(10); Wurm wurm2 = liste2.getAt(1); } }

Diamond-Operator (Java 7)

INTERFACES & ABSTRAKTE KLASSEN

IMPLEMENTIERUNG VS. SCHNITTSTELLE

• Nagel rein

• Nagel raus

• Handgri#

IMPLEMENTIERUNG VS. SCHNITTSTELLE

• Stahlkopf abge!acht im Presswerk

• Gabel maschinell eingefräst

• Handgri# aus wetter-festem Kunststo#

COMPARABLE

public interface Comparable<T> { public int compareTo(T o); }

public class Wurm implements Comparable<Wurm> { public String name;

public Wurm(String name) { this.name = name; }

@Override public int compareTo(Wurm wurm) { return this.name.compareTo(wurm.name); } }

COMPARABLE WURM

WURM VERGLEICHEN

public class Spiel { private static void sortiere(Comparable[] a) { if(a[0].compareTo(a[1]) > 0) { // tausche a[0] und a[1] } }

public static void main(String[] args) { Wurm[] wuermer = { new Wurm(„Heinrich"), new Wurm("Dieter") }; sortiere(wuermer); } }

ABSTRAKTE KLASSENpublic abstract class SpielObjekt { public void kollidiere(SpielObjekt objekt) { //... reagiereAuf(objekt); }

public abstract void reagiereAuf(SpielObjekt objekt); }

public class Wurm extends SpielObjekt { @Override public void reagiereAuf(SpielObjekt objekt) { //... } }

ÜBUNG

Bild Quelle

Memes http://www.quickmeme.com, http://www.memecenter.com

Comics http://geek-and-poke.com/

Computer programming

http://www.lastwordonnothing.com/wp-content/uploads/2010/07/under_the_hood.png

Hammer http://en.wikipedia.org/wiki/File:Claw-hammer.jpg

Känguru http://www.deviantart.com/art/Kangaroo-Transfurmation-102598471

BILDQUELLEN