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 Instanzvariablen (Member) public class Wurm { public int leben; private int team; private Waffe waffe; Konstruktor Wurm.java public Wurm(Waffe waffe, int leben, int team) { this.waffe = waffe; this.leben = leben; this.team = team; public int waffeabfeuern() { return waffe.feuer(); this object public void schadenerleiden(int schaden) { leben = Math.max(0, leben - schaden);
WAFFE public class Waffe { private int munition; private static final int schaden = 100; Klassenvariable Waffe.java public Waffe(int munition) { this.munition = munition; public int feuer() { if (munition > 0) { munition--; return schaden; else { return 0;
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 public class Waffe { Klassenvariable 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; Packagename public class Wurm { public int leben; private int team; 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; 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 gleiches Package wurm1.schadenerleiden(wurm2.waffeabfeuern()); System.out.println(wurm1.leben);
package de.hhu.propra.examples; public class Spiel { anderes Package 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; public class Spiel { public static void main(string[] args) { //... Wurm wurm1 = new Wurm(waffe1, 100, 1); einfacher Name sichtbar Name importiert 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; public class Waffe { private String name; private Image image; private void kollidiere() { //... 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 Projektil Waffe Rüstung Bonus Bazooka Shotgun 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 KlasseA SubKlasseA1 KlasseB package2 SubKlasseA2 KlasseC Auf welche Member in KlasseA können die anderen Klassen zugreifen? 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