EINFÜHRUNG IN DIE PROGRAMMIERUNG OBJEKTORIENTIERTES PROGRAMMIEREN Tobias Witt 25.03.2014 • 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() WURM public class Wurm { public int leben; private int team; Instanzvariablen (Member) Wurm.java Konstruktor private Waffe waffe; public Wurm(Waffe waffe, int leben, int team) { this.waffe = waffe; this.leben = leben; this.team = team; } „this object“ public int waffeAbfeuern() { return waffe.feuer(); } public void schadenErleiden(int schaden) { leben = Math.max(0, leben - schaden); } } WAFFE Klassenvariable public 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.java SPIEL Typ (= Klasse) Instanz (= Objekt) Konstruktor der Klasse 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); Spiel.java wurm1.schadenErleiden(wurm2.waffeAbfeuern()); System.out.println(wurm2.leben); } } KLASSEN VS. OBJEKTE • new erzeugt Instanz oder Objekt von Klasse • Objekt: ‣ Identität (Name bzw. Id) ‣ Zustand (Variablen bzw. Member) ‣ Verhalten (Methoden) SPEICHER 4 5 … … … • int a = 5; • int b = 4; SPEICHER 0x#aca 9 … … … • int c = a + b; • String d = "hallo"; SPEICHER 0x#aca 9 … … … "hallo" 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; } Kopie des Wertes void eineMethode(Wurm wurm) { wurm.leben = 10; } Kopie der Referenz int schaden = 100; Wurm wurm = new Wurm(waffe, 100, 1); eineMethode(schaden); eineMethode(wurm); schaden >> 100 wurm.leben >> 10 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 public class Waffe { public static int schaden1 = 100; public int schaden2 = 200; } Waffe w1 = new Waffe(); Waffe w2 = new Waffe(); Unschön KLASSENVARIABLEN VS. INSTANZVARIABLEN Klassenvariable public class Waffe { public static int schaden1 = 100; public int schaden2 = 200; } Instanzvariable Waffe w1 = new Waffe(); Waffe w2 = new Waffe(); 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; public class Wurm { public int leben; private int team; Packagename Eindeutiger Name: de.hhu.propra.examples.wurmclass.Wurm 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; gleiches Package 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); einfacher Name sichtbar wurm1.schadenErleiden(wurm2.waffeAbfeuern()); System.out.println(wurm1.leben); } } package de.hhu.propra.examples; anderes Package public class Spiel { public static void main(String[] args) { //... de.hhu.propra.examples.wurmclass.Wurm wurm1... //... vollständiger Name notwendig wurm1.schadenErleiden(wurm2.waffeAbfeuern()); System.out.println(wurm1.leben); } } package de.hhu.propra.examples; anderes Package import de.hhu.propra.examples.wurmclass.Wurm; Name importiert public class Spiel { public static void main(String[] args) { //... Wurm wurm1 = new Wurm(waffe1, 100, 1); einfacher Name sichtbar wurm1.schadenErleiden(wurm2.waffeAbfeuern()); System.out.println(wurm1.leben); } } 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); } } Object Spielobjekt Wurm Item Waffe Bazooka Shotgun Projektil Rüstung Bonus Gürtel Doppelter Schaden 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 SubKlasseA2 SubKlasseA1 KlasseC Auf welche Member in KlasseA können die anderen Klassen zugreifen? KlasseB private protected - public KlasseA ✔ ✔ ✔ ✔ SubKlasseA1 ✘ ✔ ✔ ✔ KlasseB ✘ ✔ ✔ ✔ SubKlasseA2 ✘ ✔ ✘ ✔ KlasseC ✘ ✘ ✘ ✔ 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"); CASTING • Explizites Casting von großem Typ zu kleinem Typ • Verlust von Informationen möglich float a = 1.5; int b = (int) a; cast-Operator SpielObjekt[] objekte = { new Wurm("Heinrich"), new Waffe(100) }; Wurm heinrich = (Wurm) objekte[0]; Waffe bazooka = (Waffe) objekte[1]; 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 wetterfestem Kunststo# COMPARABLE public interface Comparable<T> { public int compareTo(T o); } COMPARABLE WURM 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); } 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 KLASSEN public 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 BILDQUELLEN 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