ProPra-Vorkurs

Werbung
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
Herunterladen