Upload
vuongphuc
View
216
Download
0
Embed Size (px)
Citation preview
• 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/
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)
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
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
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
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); } }
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
• 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)
IMPLEMENTIERUNG VS. SCHNITTSTELLE
• Stahlkopf abge!acht im Presswerk
• Gabel maschinell eingefräst
• Handgri# aus wetter-festem Kunststo#
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) { //... } }
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